From b011be1e98d51f8949ff5596694d8fd1642a70d4 Mon Sep 17 00:00:00 2001 From: Menghuan1918 Date: Mon, 28 Sep 2026 18:08:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(sidebar):=20=E6=89=93=E5=BC=80=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=8F=8C=E6=BA=90=E5=B9=B6=E5=AD=98=20+=20=E5=A4=9A?= =?UTF-8?q?=E9=80=89=E5=8E=8B=E7=BC=A9=E4=B8=8B=E8=BD=BD=20+=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8F=98=E5=8A=A8=E5=B1=82=E7=BA=A7=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户追加三条需求,全部落地: 1) 打开方式 = 宿主探测应用 + 插件自研 open-with(并存) - 逐字恢复 src/client/open-with.ts / open-with-settings.tsx / plugin-settings.ts / src/open-external.ts / open.external 路由 / api.openExternal / editor descriptor 的 settings.render,以及 20 个 openWith* 词条(19 份词典从 main 取回原文) - 恢复 menu-flip.ts + layout.css 子菜单翻转规则(子菜单回来了) - FileTree 菜单段(无标题行):宿主行 → 分隔线 → 插件 pinned + 「在应用中打开 >」 子菜单(图钉 / SSH 后缀原样)→ 分隔线 → 宿主 reveal;宿主可用时过滤插件 explorer 目标,宿主不可用时插件行照旧(SSH 远端场景保持可用) - 死键清理:菜单去掉标题行后 openInApp 词条无引用,已从 21 份词典删除 2) 文件页多选右键「压缩并打包下载」 - 新增 src/zip.ts(自研 ZIP:方法 0/8 按收益二选一、UTF-8 bit 11、目录条目、 自实现 CRC32、无第三方依赖)+ src/archive-route.ts(名净化 + 递归收集)+ GET /sidebar/archive(同一道 workspace fence、目录递归跳过符号链接、 10000 条目 / 256 MiB 上限)+ api.archiveUrl - FileTree:多选 ≥2 项或单选目录时出现;fetch → blob → objectURL 下载, 路由错误(超限 / fence / 非 GET)以 zipFailed 显示在错误条 - 修掉真实缺陷:central directory 只写 MS-DOS 位而 version-made-by 声称 Unix, Info-ZIP 会把每个文件解成 mode 000;改为 Unix 语义(0o100644 * 0x10000, << 16 会溢出 int32)。系统 unzip 复验:mode 644/755、unzip -t 无错 3) 文件变动页层级树 + 视觉打磨 - 新增 src/client/changes/change-tree.ts:单子目录链压缩成一行、目录先于文件、 大小写不敏感排序、文件带 GitFileStatus、目录带下级变更数 - GitLens 两组各自渲染树:折叠状态按「组+路径」独立、默认展开;分组头吸顶 + 计数胶囊;Stage all/Unstage all 改为带 aria-label 的 IconButton;选中 = interactive-bg-active + 2px 内嵌强调条;12px/级缩进 + l1 参考线; 历史行 hash 徽标 / ref 胶囊 / 作者·时间右对齐 验证:typecheck / lint / test(134 文件 1422 通过)/ build 全绿; DSH_CMD='npx -y --package @deepseek-ai/dsh@0.1.7-rc.1 dsh' pnpm test:mount 7/7 通过; 真实宿主截图确认三条需求(多选+双源菜单+zip 项、变动页树形层级) --- README.md | 6 +- README_EN.md | 6 +- docs/plans/2026-09-27-files-changes-uiux.md | 69 ++++ src/archive-route.ts | 100 +++++ src/client/EditorHost.tsx | 60 +++ src/client/FileTree.tsx | 289 +++++++++++-- src/client/TreePanel.tsx | 18 +- src/client/api.ts | 61 +++ src/client/builtins/tabs.tsx | 10 +- src/client/changes/ChangesTab.tsx | 1 + src/client/changes/GitLens.tsx | 294 +++++++++---- src/client/changes/change-tree.ts | 124 ++++++ src/client/changes/changes.module.css | 170 ++++++-- src/client/layout.css | 60 +++ src/client/locales-ar.ts | 24 +- src/client/locales-de.ts | 24 +- src/client/locales-fr.ts | 24 +- src/client/locales-hi.ts | 24 +- src/client/locales-id.ts | 24 +- src/client/locales-it.ts | 24 +- src/client/locales-ja.ts | 24 +- src/client/locales-ko.ts | 24 +- src/client/locales-nl.ts | 24 +- src/client/locales-pl.ts | 24 +- src/client/locales-pt.ts | 24 +- src/client/locales-ru.ts | 24 +- src/client/locales-sv.ts | 24 +- src/client/locales-th.ts | 24 +- src/client/locales-tr.ts | 24 +- src/client/locales-vi.ts | 24 +- src/client/locales-zh-HK.ts | 24 +- src/client/locales-zh-MO.ts | 24 +- src/client/locales-zh-TW.ts | 24 +- src/client/locales.ts | 48 ++- src/client/menu-flip.ts | 68 +++ src/client/open-with-settings.tsx | 135 ++++++ src/client/open-with.ts | 221 ++++++++++ src/client/plugin-settings.ts | 43 ++ src/client/sidebar.module.css | 53 +++ src/index.ts | 68 +++ src/open-external.ts | 89 ++++ src/zip.ts | 248 +++++++++++ tests/builtins.spec.ts | 6 +- tests/changes-ops.spec.ts | 111 ++++- tests/changes-tab.spec.tsx | 12 +- tests/file-tree-archive.spec.tsx | 317 ++++++++++++++ tests/file-tree-open-in-app.spec.tsx | 119 +++++- tests/file-tree-open-with.spec.tsx | 256 ++++++++++++ tests/git-view-worktree.spec.tsx | 133 ++++++ tests/menu-flip.spec.tsx | 122 ++++++ tests/open-external-client.spec.ts | 98 +++++ tests/open-external.spec.ts | 73 ++++ tests/open-with-settings.spec.tsx | 112 +++++ tests/open-with.spec.ts | 150 +++++++ tests/smoke.spec.ts | 20 + tests/zip.spec.ts | 436 ++++++++++++++++++++ 56 files changed, 4468 insertions(+), 194 deletions(-) create mode 100644 src/archive-route.ts create mode 100644 src/client/changes/change-tree.ts create mode 100644 src/client/menu-flip.ts create mode 100644 src/client/open-with-settings.tsx create mode 100644 src/client/open-with.ts create mode 100644 src/client/plugin-settings.ts create mode 100644 src/open-external.ts create mode 100644 src/zip.ts create mode 100644 tests/file-tree-archive.spec.tsx create mode 100644 tests/file-tree-open-with.spec.tsx create mode 100644 tests/menu-flip.spec.tsx create mode 100644 tests/open-external-client.spec.ts create mode 100644 tests/open-external.spec.ts create mode 100644 tests/open-with-settings.spec.tsx create mode 100644 tests/open-with.spec.ts create mode 100644 tests/zip.spec.ts diff --git a/README.md b/README.md index a98699e..6640210 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ 相比 DSH 官方侧边栏,本插件补上的关键能力: - **🖥️ 可编辑的代码编辑器**:官方文档预览是**只读**的 → 插件保留**可编辑**的 CodeMirror 编辑器(保存、语法高亮、预览切换);Markdown / HTML 也走插件自有渲染(Mermaid 图表安全渲染 + 点击放大、README 级内嵌 HTML、浮动目录大纲、HTML 沙箱预览) -- **🗂️ 增强文件树**:接管内置「文件」页——懒加载目录树、**展开的目录实时 watch 自动刷新**、软链接识别、全局文件名搜索、拖拽上传、悬浮 `@文件` 一键引用进输入框;**Ctrl/Cmd 多选 + Shift 连选**(批量复制路径 / 批量删除)、**Git 变更着色 + 状态字母**(VS Code 同款)、**新建文件夹**,右键「打开方式」直接复用 DSH 自带的 open-in-app(宿主探测到的系统关联应用 + 文件管理器显示) +- **🗂️ 增强文件树**:接管内置「文件」页——懒加载目录树、**展开的目录实时 watch 自动刷新**、软链接识别、全局文件名搜索、拖拽上传、悬浮 `@文件` 一键引用进输入框;**Ctrl/Cmd 多选 + Shift 连选**(批量复制路径 / 批量删除)、**Git 变更着色 + 状态字母**(VS Code 同款)、**新建文件夹**、**多选右键「压缩并打包下载」**(服务端流式打 ZIP,无第三方依赖);右键「打开方式」= **DSH 自带 open-in-app**(宿主探测到的本机关联应用 + 文件管理器显示)**+ 插件自研打开方式**(资源管理器 / VS Code / Cursor / Zed / 自定义编辑器 URL 模板、SSH 远端、固定到菜单)两者并存 - **🌿 文件变动**(官方侧栏没有 Git 面板):Git 视角(暂存 / 提交 / 历史 / 工作树与子仓库)+ 本轮 AI 改动视角双合一,统一 diff 渲染(行内字符级高亮、语法着色、敏感内容脱敏);两视角共用一套 28px 行、单一空态/错误通道与吸底提交条 - **🧩 任务管理**(官方没有):子代理拓扑实时预览 + 后台任务清单(退出码 / 实时输出 / 强制终止) - **💬 侧边对话**(官方没有,beta):Codex 风格侧边线程——继承主会话完整上下文独立运行,可持续追问,一键提升为顶层会话 @@ -171,9 +171,9 @@ dsh registry enable dsh-external/dsh-better-sidebar | | | |---|---| -| **🗂️ 文件工作台:资源管理器**
支持两种格式的资源管理器:内嵌在文件预览中 / 独立显示文件树。懒加载目录树、**展开的目录由宿主按目录 watch、改动后自动重列**、软链接按目标类型展示(目录软链接可展开、失效链接标红)、全局文件名搜索、上传文件/文件夹与拖放上传、右键菜单(在新 Tab 打开 / 在侧边打开 / 新建文件夹 / 打开方式(DSH 自带 open-in-app:系统关联应用 + 文件管理器显示)/ 复制路径 / 重命名 / 删除)、**Ctrl/Cmd 多选与 Shift 连选**(批量复制路径 / 批量删除)、**Git 变更按状态着色并带 M/A/D/U 字母**、悬浮 `@文件` 一键引用进输入框。
文件资源管理器
| **📝 Markdown · HTML 内联预览**
Markdown 预览支持 **Mermaid 图表**(`securityLevel: 'strict'` 安全渲染 + 二次清洗;点击图表弹窗放大、滚轮缩放、拖拽平移)、**README 级内嵌 HTML**(徽章墙 `
`、`
` 折叠块内嵌 markdown、表格单元格内联标签——DOMPurify 白名单消毒真实渲染,`