From 36fbc5ac7e2cd414d906a55778a7184af6153b5c Mon Sep 17 00:00:00 2001 From: Menghuan1918 Date: Mon, 28 Sep 2026 00:27:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(sidebar):=20=E6=96=87=E4=BB=B6=E9=A1=B5?= =?UTF-8?q?=E4=B8=8E=E6=96=87=E4=BB=B6=E5=8F=98=E5=8A=A8=E9=A1=B5=20UIUX?= =?UTF-8?q?=20=E9=87=8D=E6=9E=84=20+=20=E5=85=A8=E5=B1=80=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=8A=BD=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文件页(FileTree/TreePanel) - Ctrl/Cmd 多选 + Shift 按可见行序连选(Esc/点空白/右键收敛),批量条支持复制路径、批量删除(共享 ConfirmDialog + 顺序 fsRemove) - Git 变更着色:行名按状态上色 + M/A/D/U 徽标,目录按 dirHasChanges 着色,非仓库静默降级(数据来自共享 git 状态存储) - 新建文件夹:fs.mkdir 路由 + mkdirWorkspaceEntry + 内联输入行(Enter/Esc/blur/IME 守卫) - 性能:FileRow/DirRow memo(含反向验证)、搜索 hidden 停车不再卸载树、level 拉取世代守卫 + AbortController、fs.tree truncated 提示、use-dir-watch 入参 memo - 拖拽上传视觉 token 化(硬编码色清零);可见性下传后隐藏页签停止轮询 - 右键「打开方式」改为复用 DSH 自带 open-in-app(宿主探测的关联应用 + 文件管理器显示) 文件变动页(changes/diff) - 36px 头(宿主 SegmentedControl)+ 单一 ChangeRow + SectionHeader 分组 + 吸底提交条单状态行 + 历史独立空态 - 修掉:双份空态、暂存失败 unhandled rejection、手动刷新被丢、仓库切换刷新两次、worktree 清单缺 repoRoot、工作树被自动切走、预览持旧快照、恢复高度未 clamp、session ops 无谓轮询 - DiffPane/DiffTab 共用 use-git-diff;修掉 DiffPane 的 untracked 预览从不渲染 全局组件与宿主接入 - 新增 src/client/ui(IconButton/Chip/SectionHeader/Notice/ConfirmDialog/StatusBadge + 共享 git 状态存储) - 新增 src/client/open-in-app.ts(宿主 open-in-app 客户端适配),删除自研 open-with 全链路与 open.external 路由 - 客户端 inject 补 remote / remote.session:缺声明时 ctx.get('remote').session 会抛出并把整个面板打成错误条(真实挂载 lane 抓到) - 词典:+25 键 / -20 openWith* / -noChanges,20 份同步 验证:typecheck / lint / test(126 文件 1322 通过)/ build 全绿; DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过(含 tab sweep 与 perf lane) --- README.md | 8 +- README_EN.md | 8 +- docs/external-plugin-guide.md | 2 +- docs/plans/2026-09-27-files-changes-uiux.md | 409 ++++++ src/client/DiffTab.tsx | 159 +-- src/client/EditorHost.tsx | 74 +- src/client/FileTree.tsx | 1252 +++++++++++++----- src/client/TreePanel.tsx | 170 +-- src/client/UploadOverlay.tsx | 2 +- src/client/api.ts | 54 +- src/client/builtins/tabs.tsx | 13 +- src/client/changes/ChangesTab.tsx | 184 ++- src/client/changes/DiffPane.tsx | 260 +--- src/client/changes/GitLens.tsx | 1310 ++++++++++--------- src/client/changes/SessionLens.tsx | 45 +- src/client/changes/changes.module.css | 367 ++---- src/client/diff/use-git-diff.ts | 183 +++ src/client/index.tsx | 12 +- src/client/layout.css | 61 - src/client/locales-ar.ts | 46 +- src/client/locales-de.ts | 46 +- src/client/locales-fr.ts | 46 +- src/client/locales-hi.ts | 46 +- src/client/locales-id.ts | 46 +- src/client/locales-it.ts | 46 +- src/client/locales-ja.ts | 46 +- src/client/locales-ko.ts | 46 +- src/client/locales-nl.ts | 46 +- src/client/locales-pl.ts | 46 +- src/client/locales-pt.ts | 46 +- src/client/locales-ru.ts | 46 +- src/client/locales-sv.ts | 46 +- src/client/locales-th.ts | 46 +- src/client/locales-tr.ts | 46 +- src/client/locales-vi.ts | 46 +- src/client/locales-zh-HK.ts | 46 +- src/client/locales-zh-MO.ts | 46 +- src/client/locales-zh-TW.ts | 46 +- src/client/locales.ts | 109 +- src/client/menu-flip.ts | 68 - src/client/open-in-app.ts | 214 +++ src/client/open-with-settings.tsx | 135 -- src/client/open-with.ts | 221 ---- src/client/plugin-settings.ts | 43 - src/client/sidebar.module.css | 270 ++-- src/client/ui/git-status.ts | 300 +++++ src/client/ui/index.ts | 13 + src/client/ui/kit.module.css | 219 ++++ src/client/ui/kit.tsx | 188 +++ src/client/use-dir-watch.ts | 18 +- src/fs-operations.ts | 40 + src/index.ts | 27 +- src/open-external.ts | 89 -- tests/builtins.spec.ts | 6 +- tests/changes-tab.spec.tsx | 282 +++- tests/diff-git-target.spec.tsx | 184 +++ tests/file-tree-dir-watch.spec.tsx | 158 +++ tests/file-tree-drop.spec.tsx | 3 + tests/file-tree-git-status.spec.tsx | 145 ++ tests/file-tree-multiselect.spec.tsx | 246 ++++ tests/file-tree-new-folder.spec.tsx | 253 ++++ tests/file-tree-open-in-app.spec.tsx | 291 ++++ tests/file-tree-open-with.spec.tsx | 248 ---- tests/file-tree-rename-delete.spec.tsx | 3 + tests/file-tree-reveal-scroll.spec.tsx | 3 + tests/file-tree-row-memo.spec.tsx | 134 ++ tests/file-tree-search-persist.spec.tsx | 190 +++ tests/fs-mkdir.spec.ts | 82 ++ tests/git-view-worktree.spec.tsx | 300 ++++- tests/menu-flip.spec.tsx | 122 -- tests/open-external-client.spec.ts | 98 -- tests/open-external.spec.ts | 73 -- tests/open-in-app.spec.ts | 171 +++ tests/open-with-settings.spec.tsx | 112 -- tests/open-with.spec.ts | 150 --- tests/ui-kit.spec.tsx | 250 ++++ 76 files changed, 6961 insertions(+), 3944 deletions(-) create mode 100644 docs/plans/2026-09-27-files-changes-uiux.md create mode 100644 src/client/diff/use-git-diff.ts delete mode 100644 src/client/menu-flip.ts create mode 100644 src/client/open-in-app.ts delete mode 100644 src/client/open-with-settings.tsx delete mode 100644 src/client/open-with.ts delete mode 100644 src/client/plugin-settings.ts create mode 100644 src/client/ui/git-status.ts create mode 100644 src/client/ui/index.ts create mode 100644 src/client/ui/kit.module.css create mode 100644 src/client/ui/kit.tsx delete mode 100644 src/open-external.ts create mode 100644 tests/diff-git-target.spec.tsx create mode 100644 tests/file-tree-dir-watch.spec.tsx create mode 100644 tests/file-tree-git-status.spec.tsx create mode 100644 tests/file-tree-multiselect.spec.tsx create mode 100644 tests/file-tree-new-folder.spec.tsx create mode 100644 tests/file-tree-open-in-app.spec.tsx delete mode 100644 tests/file-tree-open-with.spec.tsx create mode 100644 tests/file-tree-row-memo.spec.tsx create mode 100644 tests/file-tree-search-persist.spec.tsx create mode 100644 tests/fs-mkdir.spec.ts delete mode 100644 tests/menu-flip.spec.tsx delete mode 100644 tests/open-external-client.spec.ts delete mode 100644 tests/open-external.spec.ts create mode 100644 tests/open-in-app.spec.ts delete mode 100644 tests/open-with-settings.spec.tsx delete mode 100644 tests/open-with.spec.ts create mode 100644 tests/ui-kit.spec.tsx diff --git a/README.md b/README.md index 76c4b63..a98699e 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,8 @@ 相比 DSH 官方侧边栏,本插件补上的关键能力: - **🖥️ 可编辑的代码编辑器**:官方文档预览是**只读**的 → 插件保留**可编辑**的 CodeMirror 编辑器(保存、语法高亮、预览切换);Markdown / HTML 也走插件自有渲染(Mermaid 图表安全渲染 + 点击放大、README 级内嵌 HTML、浮动目录大纲、HTML 沙箱预览) -- **🗂️ 增强文件树**:接管内置「文件」页——懒加载目录树、**展开的目录实时 watch 自动刷新**、软链接识别、全局文件名搜索、拖拽上传、悬浮 `@文件` 一键引用进输入框 -- **🌿 文件变动**(官方侧栏没有 Git 面板):Git 视角(diff / 历史 / 暂存·提交·还原)+ 本轮 AI 改动视角双合一,统一 diff 渲染(行内字符级高亮、语法着色、敏感内容脱敏) +- **🗂️ 增强文件树**:接管内置「文件」页——懒加载目录树、**展开的目录实时 watch 自动刷新**、软链接识别、全局文件名搜索、拖拽上传、悬浮 `@文件` 一键引用进输入框;**Ctrl/Cmd 多选 + Shift 连选**(批量复制路径 / 批量删除)、**Git 变更着色 + 状态字母**(VS Code 同款)、**新建文件夹**,右键「打开方式」直接复用 DSH 自带的 open-in-app(宿主探测到的系统关联应用 + 文件管理器显示) +- **🌿 文件变动**(官方侧栏没有 Git 面板):Git 视角(暂存 / 提交 / 历史 / 工作树与子仓库)+ 本轮 AI 改动视角双合一,统一 diff 渲染(行内字符级高亮、语法着色、敏感内容脱敏);两视角共用一套 28px 行、单一空态/错误通道与吸底提交条 - **🧩 任务管理**(官方没有):子代理拓扑实时预览 + 后台任务清单(退出码 / 实时输出 / 强制终止) - **💬 侧边对话**(官方没有,beta):Codex 风格侧边线程——继承主会话完整上下文独立运行,可持续追问,一键提升为顶层会话 - **🖥️ 底部工作台**(官方没有):右列交给 DSH 原生右侧栏,插件另加自绘底部工作台(拖拽分栏 / 按会话持久化),可与原生栏同时展开 @@ -171,9 +171,9 @@ dsh registry enable dsh-external/dsh-better-sidebar | | | |---|---| -| **🗂️ 文件工作台:资源管理器**
支持两种格式的资源管理器:内嵌在文件预览中 / 独立显示文件树。懒加载目录树、**展开的目录由宿主按目录 watch、改动后自动重列**、软链接按目标类型展示(目录软链接可展开、失效链接标红)、全局文件名搜索、上传文件/文件夹与拖放上传、右键菜单(在新 Tab 打开 / 在侧边打开 / 复制路径)、悬浮 `@文件` 一键引用进输入框。
文件资源管理器
| **📝 Markdown · HTML 内联预览**
Markdown 预览支持 **Mermaid 图表**(`securityLevel: 'strict'` 安全渲染 + 二次清洗;点击图表弹窗放大、滚轮缩放、拖拽平移)、**README 级内嵌 HTML**(徽章墙 `
`、`
` 折叠块内嵌 markdown、表格单元格内联标签——DOMPurify 白名单消毒真实渲染,`