ShanHaiFish / fexp-file-explorer

Listed

DSH 动态 Cordis 插件:在左侧工作区浏览目录与文件。双入口(文件浏览/打开目录)、320px 浏览面板、文件预览、一键打开系统资源管理器、文件引用添加到聊天。A dynamic Cordis plugin for DSH: workspace file explorer in the left sidebar.

masterOther View source

Installation

npx -y @deepseek-ai/dsh plugin --profile web add github:ShanHaiFish/fexp-file-explorer

This installation command is an unverified starting point generated from the GitHub repository address.

README

Maintainer-authored documentation snapshot.

View on GitHub ↗
Commit 0a331a5Synced Aug 18, 2026

左侧文件浏览器 (fexp)

English · 中文

GitHub Release License GitHub Stars Docs

DSH(DeepSeek Harness)动态 Cordis 插件:在左侧工作区浏览目录与文件。双入口(侧栏顶部「文件浏览」胶囊 + 会话标题栏「打开目录」按钮)→ 320px 滑出面板,自动定位当前工作区目录,点击目录进入、点击文件预览文本内容;工具栏可一键在系统资源管理器中打开当前目录,预览时可把文件引用添加到聊天输入框。

v1.5.0 起为静态 bundle 插件,随 profile 层栈自动加载——安装一次,每次启动 DSH 即自动生效,不再需要手动 define/run。

功能特性

  • 双入口(SVG 矢量图标, 颜色全部使用主题 CSS 变量, 深浅色及任意主题下文字与背景都保持对比):
    • 侧栏顶部「工作区」标题行右侧的「文件浏览」胶囊按钮(宽栏时显示; 工作区「搜索会话」搜索框展开时自动隐藏, 避免遮挡搜索框, v1.5.1)
    • 会话标题栏「打开目录」按钮
  • 浏览面板(点击任意入口滑出, 320px, 覆盖左侧区域):
    • 自动定位到当前工作区目录(当前会话 cwd); 切换工作区后面板自动重新定位, 同一工作区重开保留上次浏览位置
    • 目录在前、文件在后, 文件显示大小; 点击目录进入、点击文件预览
    • 面包屑任意层级跳转; 工具栏: 当前工作区 / 回到根目录 / 上一级 / 刷新 / 在系统资源管理器中打开
    • 文件预览: 文本内容(默认 256KB 上限, 最大 1MB), 二进制/超限有明确提示
    • 预览头部: 文件名 / 大小 / [添加到聊天] / 关闭预览
  • 在系统资源管理器中打开: 一键用系统资源管理器打开当前浏览的目录 (DSH 原生 host.openPath, Windows 走 Invoke-Item)
  • 添加到聊天: 预览文件时把文件引用 [文件名](绝对路径) 追加到聊天输入框草稿 (不覆盖已有内容), 可连续添加多个文件, 方便告诉 AI 具体文件信息
  • 图标(v1.4.0): Google Material Icons 官方库(fonts.google.com/icons, Apache 2.0 许可), 实心填充风格小尺寸下依然清晰, 与 Chrome/Android 大厂视觉一致

界面预览

fexp 界面截图 1fexp 界面截图 2fexp 界面截图 3

快速开始

# 安装(静态 bundle, 推荐)
dsh plugin --profile web add fexp-file-explorer

本地未发布时用 file: 指向本仓库(注意路径不能含空格):

dsh plugin --profile web add file:/path/to/fexp-file-explorer

重启 dsh web 后插件即自动生效:侧栏顶部出现「文件浏览」胶囊按钮,会话标题栏出现「打开目录」按钮,无需手动 define/run。

使用说明

  1. 打开面板: 点击侧栏「文件浏览」或会话标题栏「打开目录」, 320px 面板从左侧滑出, 自动定位到当前工作区目录;
  2. 浏览: 点击目录进入下一级, 用工具栏「上一级 / 回到根目录 / 刷新」导航, 或点面包屑任意层级跳转;
  3. 预览文件: 点击文件在面板底部预览文本内容(默认 256KB 上限);
  4. 添加到聊天: 预览时点击「添加到聊天」, 文件引用 [文件名](绝对路径) 追加到输入框草稿, 编辑后发送;
  5. 在系统资源管理器中打开: 工具栏最右侧按钮, 一键打开当前浏览的目录(Windows 走 Invoke-Item)。

仓库内容

路径说明
package.json + cordis.patch.yml + lib/ + client/静态 bundle(推荐):dsh plugin add 安装后随 DSH 启动自动加载
host-source.js + client-source.js动态插件回退形态:无 bundle 能力的 profile 按下方流程加载
manifest.json插件元数据 + 恢复定义参数(plugin/name/purpose/version)
LICENSEMIT 许可证
assets/界面预览截图(screenshot-1~3.png)
AGENTS.md代理协作约定(重建流程/修改工作流/编码约定/版本管理)
README.md / README.en.md中文 / English 文档

双形态说明

静态 bundle(v1.5.0, 推荐)动态插件(回退)
加载方式dsh plugin add 装进 profile 层栈, 随 DSH 启动自动加载每次 DSH 重启后需 cordis_define + cordis_run 手动注册
代码位置lib/index.js(Host) + client/client.js(Client)host-source.js + client-source.js
适用场景正常 profile(web 等)无 bundle 能力的 profile

动态回退形态步骤:

  1. 让 agent 读取 host-source.jsclient-source.js;
  2. cordis_define:plugin: { kind:"new", idPrefix:"fexp" },name/purpose 取 manifest.json(purpose 含 CAPABILITIES: fs, rpc 声明),code.host / code.client 取两个源码文件的完整内容;
  3. cordis_run 激活;面板出现即成功。

动态形态不跨 DSH 进程存续,重启后需重新加载;静态 bundle 形态无此限制。

技术要点

  • Host 半区: 静态 bundle 形态在 lib/index.js,经 webServer 挂三个 JSON 路由(/fexp/default-root / /fexp/list-dir / /fexp/read-file), 底层使用 DSH 的 fs 服务(resolve/listDir/stat/readText) 与 sandboxPolicy.workspaceRoot; 动态回退形态在 host-source.js,通过 harness.handle 暴露同名三个 RPC。
  • Client 半区: 全部使用增量插槽(shell.overlayconversation.session.header.actionsconversation.input.docksidebar.footer.action), 不替换任何内置 UI; 纯 JS + React.createElement, 无 JSX/TS; 静态形态经 window.__ModuleLoader__.load 注册, host.call → fetch 同源路由, styles.insert → 自建 <style> 标签。
  • 竞态修复(v1.0.0): useStore 订阅后立即自愈同步当前状态, 避免"探针写入 早于订阅导致更新丢失"的启动时序竞态; sidebarWide 默认 true, 探针异常时 顶部按钮仍可见。
  • 打开资源管理器(v1.1.0): Client 直接调用 ctx.get('workspaces').openPath(path) (即 DSH 原生 host.openPath, Windows 走 Invoke-Item); 不新增 Host RPC, 无 spawn/网络能力。
  • 添加到聊天(v1.2.0): 会话作用域插槽 conversation.input.dock 内的隐藏桥 组件捕获标准包 inputActions(setDraft) 与 useInput(草稿订阅), 面板 「添加到聊天」调用 setDraft(现有草稿 + 文件引用); 这是内置 UI 写输入框的 同一官方通道, 纯 Client 能力, 无新 Host RPC。
  • 工作区绑定(v1.2.2): 面板加载 effect 原以 path === null 为守卫, 之前浏览过 后关闭再打开(或切换工作区)不会重新加载, 导致「文件浏览」展示上一个工作区的 旧目录; 新增 boundWs 绑定状态, 打开面板/工作区切换时若 boundWs !== 当前 wsPath 即重新绑定并加载当前工作区目录, 同一工作区重开保留上次浏览位置; 双入口统一走 openPanelFor, 工具栏「当前工作区目录」走 bindWorkspace
  • 主题对比度(v1.2.3): 入口按钮(「文件浏览」/「打开目录」)原用内联硬编码颜色 (文字 #e8edf3 近白), 浅色主题下看不清; 改为 CSS 类 .fexp-entry-btn / .fexp-entry-btn-active, 颜色全部走主题 CSS 变量(label-primary 文字、 bg-layer-1/2 背景、border-l2 边框、brand-primary 激活态), 深浅色及 任意主题自动适配, 附 hover 反馈。
  • 图标库(v1.4.0): Google Material Icons 官方库 path, 实心填充渲染 (fill="currentColor", 无 stroke), 默认尺寸 16px; 前版(v1.3.0)的 Lucide 线性图标已取代。
  • 搜索框避让(v1.5.1): 「文件浏览」入口按钮固定定位在「工作区」标题行, 工作区「搜索会话」搜索框展开时正好被按钮遮挡; TopToggleMutationObserver 监听搜索按钮 aria-expanded 状态(展开时该按钮带 aria-expanded="true" 且下一个兄弟元素为 input[type=text], 与同样带 aria-expanded 的会话行/分组折叠按钮可区分), 搜索框展开期间隐藏入口 按钮, 收起后自动恢复; Host 无改动。

安全与边界

  • 能力声明: CAPABILITIES: fs, rpc——仅文件系统访问(host 的 fs 服务) 与常规 RPC; 无网络请求、无 spawn/进程、无凭据访问。
  • 安全审查: WARN 级(33/300), 自 v1.0.0 起历版本持平; 审查引擎为 plugin_security_review / plugin_security_audit(见 dsh-plugin-security-review)。
  • 已知限制: 文件预览默认 256KB 上限(最大 1MB), 超限明确报错 FS_TOO_LARGE, 需在对话中让助手读取; 静态 bundle 随 profile 加载, 动态回退形态不跨 DSH 进程存续, 重启后需重建。

版本历史

版本说明
v1.5.1修复「文件浏览」按钮遮挡工作区「搜索会话」搜索框: 点击工作区顶部搜索图标展开搜索框时, 固定定位的入口按钮正好叠在搜索框上挡住输入; TopToggle 用 MutationObserver 监听搜索按钮 aria-expanded 状态(搜索按钮展开时带 aria-expanded="true" 且下一个兄弟元素为 input[type=text], 与会话行/分组折叠按钮可区分), 搜索框展开期间隐藏入口按钮、收起后自动恢复; Host 无改动, 纯 Client 能力, 安全审查持平 WARN(33/300)
v1.5.0静态 bundle 化: package.json(dsh.bundle.patch + dsh.client.platform)+ cordis.patch.yml + lib/index.js(webServer 挂三个 JSON 路由)+ client/client.js(ModuleLoader 注册, host.call→fetch, styles→自建标签); 随 profile 层栈自动加载, 无需重启后手动 define/run; 动态形态源码保留为回退; 安全审查持平 WARN(33/300)
v1.4.0图标整体改用 Google Material Icons 官方库(Apache 2.0): 实心填充风格小尺寸下清晰, 符合 Chrome/Android 大厂标准; 关闭面板=keyboard_double_arrow_left(« 与 VS Code 一致)、工作区=workspaces、根目录=home、上一级=arrow_upward、刷新=refresh、资源管理器=folder_open、关闭预览=close; svgIcon 改 fill=currentColor, 默认尺寸 14→16px; Host 无改动, 安全审查持平 WARN(33/300)
v1.3.0图标改用 Lucide 官方图标库(lucide.dev, ISC 许可): 关闭面板=panel-left-close、当前工作区=briefcase、根目录=house、上一级=folder-up、刷新=refresh-cw、资源管理器打开=folder-open、关闭预览=x, 语义更直观(已被 v1.4.0 的 Material Icons 取代); Host 无改动
v1.2.3修复「文件浏览」「打开目录」按钮浅色主题下文字看不清: 入口按钮改为 CSS 类并全部使用主题 CSS 变量(label-primary 文字 / bg-layer-1/2 背景 / brand-primary 激活态), 深浅色及任意主题自动适配保证对比, 补充 hover 反馈; Host 无改动
v1.2.2修复「文件浏览」打开面板定位到上一个工作区目录: 面板加载 effect 的 path===null 守卫导致切换工作区后不重载; 新增 boundWs 工作区绑定, 打开面板/切换工作区时自动重定位到当前工作区目录, 双入口统一走 openPanelFor; Host 无改动
v1.2.1修复「已添加」状态不合理: 按钮保持「添加到聊天」常显可用, 支持连续多次添加文件
v1.2.0新增预览区「添加到聊天」按钮: 经 conversation.input.dock 隐藏桥捕获标准包 inputActions/useInput, 把文件引用追加到输入框草稿, 用户编辑后发送; 纯 Client 能力, 安全审查持平 WARN(33/300)
v1.1.0新增「在系统资源管理器中打开」工具栏按钮: Client 走 DSH 原生 host.openPath(Windows Invoke-Item) 打开当前浏览目录; 无新增 Host RPC/能力, 安全审查持平 WARN(33/300)
v1.0.0最终形态: 顶部「文件浏览」+ 标题栏「打开目录」双入口; 内联样式深色适配; 启动竞态修复(订阅自愈 + 默认宽栏)
(pkg-1~pkg-7)演进过程: 侧栏底部按钮 → 顶部浮层 → 标签胶囊 → 内联样式可见性修复 → 移除底部按钮与诊断条

维护

  • 提交约定: Conventional Commits, 中文描述(feat: 新功能 / fix: 缺陷修复 / docs: 文档 / refactor: 重构 / chore: 杂项), 源码 / manifest / README 三件套保持一致。
  • 代理协作: 修改前先读 AGENTS.md; 重建插件与修改工作流详见该文件。
  • 发布: 功能迭代后打 tag(vX.Y.Z)并 gh release create 发布; 文档页由 GitHub Pages 自动构建(https://shanhaifish.github.io/fexp-file-explorer/)。

Project files and signals

Shown items are public repository signals detected in the directory snapshot.

Plugin manifestDetected

Repository information

Language
JavaScript
License
MIT
Latest release
v1.5.1
Last updated
Aug 16, 2026, 4:43 AM

Install deliberately

Review source code, permissions, lifecycle hooks, dependencies and network access. Test untrusted plugins in an isolated environment.