feat(desktop): support copying relative file locations - #3695
Open
Stella-xixi wants to merge 1 commit into
Open
Conversation
Signed-off-by: Stella-xixi <2559689615@qq.com>
|
| Filename | Overview |
|---|---|
| apps/desktop/src/renderer/lib/fileLocation.ts | 新增文件位置格式化函数,验证一基安全整数坐标并拒绝工作目录外路径。 |
| apps/desktop/src/renderer/components/chat/useFileChipContextMenu.tsx | 新增条件显示的“复制位置”动作,成功和剪贴板失败反馈与现有菜单行为一致。 |
| apps/desktop/src/renderer/components/chat/MarkdownRenderer.tsx | 将解析目标的绝对路径及行列信息透传给文件引用右键菜单,未改变解析和打开流程。 |
| apps/desktop/src/renderer/tests/fileLocation.test.ts | 覆盖 POSIX、Windows、远程逻辑路径、目录边界、无效坐标及范围起始行语义。 |
| apps/desktop/src/renderer/tests/fileChipCopyLocation.test.tsx | 覆盖菜单显隐、相对位置复制、原绝对路径动作、远程工作目录及剪贴板失败反馈。 |
Reviews (1): Last reviewed commit: "feat(desktop): support copying relative ..." | Re-trigger Greptile
Contributor
|
这个 PR 会给文件引用增加「复制相对位置」菜单项,已进入维护者确认,球不在作者手里。 请维护者直接在 PR 上 Approve;需要修改就 Request Changes。讨论 issue:#3717 |
Open
Contributor
|
命中 UI 路径(文件 chip 右键菜单 / Markdown 本地引用)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面,便于确认界面符合 DESIGN.md 设计规范。 |
Contributor
Author
已在 PR description 中补充界面效果录屏和文字说明,展示「复制文件路径」和「复制位置」的实际效果,感谢建议。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
这次改了什么
摘要
为 Cindy 回复中的文件位置引用增加“复制位置”右键菜单项,直接复制工作目录相对路径与行号,例如
src/example.ts:42;引用包含列号时复制为src/example.ts:42:7,便于粘贴到 VS Code 的文件定位入口。当前仅复制文件名或完整路径时,用户还需要手工补上相对目录和行号。本改动沿用已经解析成功的文件引用及其行列信息,不重新查询文件,不改变原有点击打开行为,也不替换“复制文件路径”的完整路径复制能力。
新入口仅对已唯一解析、位于来源工作目录内且带有效行号的文件显示。目录、缺失或歧义引用、没有有效行号、没有工作目录以及工作目录外的路径不会获得这个入口。行号范围沿用现有解析规则,复制起始行;不会推测列号或文件实际行数。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
ChatSessionFileContext中的来源工作目录与已解析绝对路径做纯字符串转换,剪贴板仍属于当前 Desktop。此动作不读取本机对应路径、不下载远程文件、不新增网络请求或协议字段。Mobile 自身的渲染与交互不在本次改动范围内;不改变 runtime fingerprint。实现说明
MarkdownRenderer.tsxline、column传给FileTargetChip和ResolvedLocalLink,覆盖 Markdown 文件链接、经现有插件识别的正文裸路径及行内代码引用。未改变 unresolved / ambiguous 分支。useFileChipContextMenu.tsxlocation参数;仅在可格式化为有效文件位置时显示新菜单项。调用现有navigator.clipboard.writeText,分别处理成功与失败提示。lib/fileLocation.tstoWorkdirRel计算工作目录相对路径,统一输出/分隔符;不依赖 Renderer 中的 Node 文件系统能力。fileLocation.test.tsfileChipCopyLocation.test.tsxi18n/locales/*/common.jsoncopyLocation和locationCopied,五语 key 检查通过。行为边界
/repo/src/example.ts:42,工作目录/reposrc/example.ts:4242:7src/example.ts:42:7C:\Repo\src\example.ts:42:7,工作目录c:\reposrc/example.ts:42:7src/example.ts:42-50src/example.ts:42UI 变化
在原“复制文件路径”下方增加“复制位置”,复用现有
DropdownMenuItem、ClipboardCopy图标及 toast。引用的设计规范:
docs/design-rules/DESIGN.md§4 Component Stylings / Select & Dropdown:沿用现有菜单组件及交互;§10 Theme System & Token Reference:不新增硬编码颜色,使用现有主题样式;§11 Voice & Content:使用“动词+对象”文案,英文菜单项为Copy Location;§14.5 聊天正文的可点性信号:保留原文件引用的点击打开能力。Light / Dark 实机目检尚未完成,不能把复用主题样式视为双模式目检通过。
-文件引用右键菜单支持两种复制方式:
「复制文件路径」:复制文件的绝对路径
「复制位置」:复制
绝对路径:行号,例如D:\repo\src\example.ts:42default.mp4
界面结构示意
以下仅说明菜单局部顺序与复制结果,不是真机截图,也不是视觉验证证据。其他既有菜单项省略。
怎么验证的
自动验证
验证平台为 Windows / Node.js 22.19.0 / pnpm 10.33.2。代码已快进到 2026-08-31 本次获取的
origin/main(123493813),修复已恢复且没有合并冲突,以下记录针对同步后的代码。同步前旧基线失败的
codexAuthInvalidation.test.ts(maker-host)与 Reviewplugin.test.ts,本轮分别以 59 项、16 项全部通过。第一次本地完整测试的未通过项如下(不是本 PR 的 GitHub CI 日志):
windowsPackagedInstanceBarrier.test.tsreadSheetProcessPackaging.test.tsdevice-link/crossProcessLock.test.tsonTaskUpdateRPC 超时pi-agent.integration.test.ts后续已在相同提交
123493813的独立干净 main 工作区与本分支,各单独复测两轮,并按 CI 展开参数运行 Desktop / maker-core 的两个完整分片(Desktop 4 workers、maker-core 1 worker;两端顺序运行)。原始三个 Desktop 文件均通过,但出现其他超时:codexProxyHost.test.ts的同一 15 秒超时在两端分片均出现,单独各两轮均通过;codexExecFunctionAdapter.e2e.test.ts的 afterEach 10 秒超时在两端单独各两轮均复现。Pi 原始三项在两端分片均失败;单独选择三个用例时,超时用例通过,环境变量与 symlink 用例均失败。独立探针以及只在诊断进程中切换到 Git Bash 的真实 Pi 用例验证表明,环境变量失败与本机默认 WSL Bash 有关;切换后两端环境变量用例通过,symlink ENOENT 不变。普通 symlink 探针可以创建,
innocent\\q则因 Windows 路径分隔符和缺失父目录报 ENOENT。Bash 完整分片超时、Desktop 的具体资源/清理瓶颈仍证据不足。没有修改无关模块、安全逻辑、断言、timeout 或系统配置,也没有把复测通过改写成全量通过。GitHub 旁证:基线主干 CI 通过;后续主干 Windows CI 在不包含本改动的情况下复现同名 crossProcessLock busy 失败。CI 跳过 Pi 二进制安装,不能用 CI 绿灯证明真实 Pi 集成用例已执行通过。
本次同步与 #3663 适配完成,按最新仓库规则的关联单测与 Desktop 类型检查已通过;更广泛测试仍有失败,完整结果如实披露,不声称全量通过。
手工验证
已 review 同步后的修复 diff;提交
d5320901f基于本次验证的origin/main快照123493813,仅包含 10 个 Desktop 文件。确认原“复制文件路径”处理函数不变,未新增权限、IPC 或文件读写。已有 Mobile.gitignore改动已保留且没有纳入提交。未启动 Electron,未执行真实剪贴板 / VS Code 粘贴或 Light / Dark 目检。菜单交互与剪贴板结果由 jsdom 测试验证,不等同于实机验证。
未执行的验证
风险
风险分类
影响与回滚
toWorkdirRel的 POSIX / Windows 逻辑,Windows 盘符路径按既有规则比较,输出统一为/。不承诺扩展现有工具不支持的路径形式;无法可靠换算时不显示新入口。提交前检查
123493813并复核修复 diffgit commit -s),本地检查通过