d0ublecl1ck/dsh-search-enhance ↗★ 0

dsh-search-enhance

DSH 搜索增强插件:在新建会话的工作区选择器内提供内联搜索,支持中文拼音全拼/首字母、英文分隔符无关子串与子序列模糊匹配。 适合工作区较多、需要快速检索并切换工作区的用户。

Package
dsh-search-enhance
Compatibility
Unverified
Version
0.1.0
License
MIT
Last updated
Oct 3, 2026

Other repositories with this package name

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:d0ublecl1ck/dsh-search-enhance

🌐 中文 · English

dsh-search-enhance

「工作区攒到三十个以后,每次开新会话都要在下拉里瞪着眼睛找一个名字——现在打两个字母就够了。」

DeepSeek Harness dsh-plugin License: MIT

给「新建会话」的工作区下拉装上搜索框:中文打拼音首字母,英文打中间任意几个字母,都能一次命中。

看效果 · 快速开始 · 匹配规则 · 它和同类有什么不同 · 安全边界


输入拼音首字母 gz,只留下「工作区拼音测试」

gz → 「工作区拼音测试」。中文名按拼音首字母和全拼建索引,不需要切换输入法。


它解决什么问题

事情是这样的:DSH 的工作区是刻意做成「可以一直加」的。一个人同时开着 foliole、笔记库、几个脚本仓库、给客户的两个项目——攒到二三十个很正常。

然后每次点「新会话」,下拉里就是一条长长的名单。官方的这个下拉没有搜索框,只能一行行看过去。你想找「工作区拼音测试」,眼睛得扫过每一个名字。

真正别扭的是:这个列表你明明能背下来,只是它太长。缺的不是记忆,是一个输入框。

这个插件做的就是这一件事——接管那个下拉,在顶上放一个搜索框,然后按你脑子里想的那个方式来匹配:

  • 想中文工作区?打 gz(拼音首字母)或 gongzuo(全拼),不用切输入法;
  • 记得英文名里有一段?打 pp 就能找到 apple-pie,不必从第一个字母开始;
  • 名字里有连字符、下划线?folioleenhance 也能找到 foliole-enhance。

效果示例

同一个下拉,输入两三个字符就开始收窄(截图来自真实运行实例,由 scripts/verify-browser.mjs 驱动拍摄):

输入结果
gz「工作区拼音测试」
ppapple-pie

输入 pp,命中 apple-pie

pp → apple-pie。英文匹配是任意位置子串,不要求前缀。

键盘全程可用:↑ ↓ 移动光标,Enter 选中,Esc 关闭,打开即自动聚焦搜索框。原来那个「添加工作区…」入口原样保留在面板底部。

快速开始

从 GitHub 安装:

dsh plugin --profile web add github:d0ublecl1ck/dsh-search-enhance

从本地克隆安装(改代码用这个):

git clone https://github.com/d0ublecl1ck/dsh-search-enhance
dsh plugin --profile web add ./dsh-search-enhance

装完重启 DSH Desktop(客户端模块图在 harness 启动时组合,刷新页面不够)。重启后打开新建会话页,点开工作区下拉,就能看到搜索框。

匹配规则

输入命中规则
gz / gzq工作区拼音测试拼音首字母(子串或前缀)
gongzuo / gongzuoqu工作区拼音测试拼音全拼(子串或前缀)
ppapple-pie英文任意位置子串
folioleenhancefoliole-enhance去掉分隔符后比较
samplesfoliole-enhance-samples普通子串
apleapple子序列(弱权重兜底,只在标题上)
路径片段对应工作区路径只参与子串匹配

排序:完全相等 > 前缀 > 子串 > 子序列;中文同时比对原文与拼音;同分保持官方原有顺序。

两条刻意的边界,都是真实浏览器里发现并修的:拼音投影不允许子序列(否则 pp 这种两字母查询会通过 gongzuoqupinyinceshi 命中几乎一切),路径不做模糊兜底(否则路径里的 /private/tmp/ 自带两个 p,人人都会命中 pp)。

触发方式

打开「新会话」页,点工作区按钮,然后:

  • gz — 找「工作区拼音测试」
  • gongzuo — 同一件事,全拼打法
  • pp — 找 apple-pie
  • folioleenhance — 找 foliole-enhance(不记得连字符在哪)
  • pkm — 找路径里含 pkm 的工作区
  • ↑ ↓ Enter — 全键盘挑一个
  • Esc 或点面板外 — 关掉,不做任何选择

它和同类有什么不同

同类插件都在解决「工作区/会话多了不好找」,但切的位置不一样:

插件它切的入口匹配方式和本插件的差异
dsh-search-enhance(本插件)「新建会话」的工作区下拉,内联搜索框拼音首字母 + 全拼 + 任意位置子串 + 分隔符无关 + 子序列兜底唯一在这个下拉里就地过滤的
dsh-workspace-kit⌘K 全局 Spotlight 面板 + 接管侧栏名称模糊搜索全局面板,不进工作区下拉;无拼音
dsh-advancesearch侧栏搜索按钮 + MCP 工具会话正文全文检索搜的是会话内容,不是选择器过滤
dsh-workspace-searchdsh-better-sidebar 的 Search 页签工作区文件内容检索搜文件,不是工作区名
dsh-codex-ui整体替换侧栏全局搜索换了一整套 UI,改动面大

选谁取决于你要找什么:找会话内容用 advancesearch,找文件用 workspace-search,找工作区选择器本身用本插件。

安全边界

  • 不写任何工作区或会话数据。 选中一行只是调用官方下拉本来就调的 onPick;「添加工作区…」走的是官方 uiWorkspace.pickDirectory() + createWorkspace()。
  • 只遮蔽,不替换。 插件以 priority: -1 注册到 single 槽 conversation.hero.workspace 遮蔽官方下拉;官方注册仍在,卸载插件即恢复。
  • 崩了会自动让位。 single 槽的渲染错误会触发槽注册表的 abdicate 语义,官方下拉随即接管——插件自身出问题不会让「选择工作区」整体不可用。
  • 零持久化、零网络。 没有 localStorage、没有额外请求、没有遥测。
  • 面板只用官方 client UI 0.1.5 与 0.1.7 都在的原子(useAnchoredPosition 加图标),图标导出名的版本差异由回退处理。

文件结构

client.js                          浏览器半边:搜索算法 + 下拉面板(含内嵌拼音表)
index.js                           宿主半边占位(bundle 需要一个 apply 导出)
cordis.patch.yml                   bundle 层:把插件插入 profile
scripts/generate-pinyin-table.mjs  生成 client.js 里的拼音表(GB2312 全字集)
scripts/verify-browser.mjs         真实浏览器端到端断言(自起 Chrome 走 CDP)
tests/search.test.mjs              搜索算法单测
tests/picker.test.mjs              组件渲染与最小 primitives 兼容性测试
assets/showcase/                   README 用的真实运行截图

验证与测试

npm install                # 只为生成拼音表(devDependency: pinyin-pro)
npm test                   # 19 项:搜索算法 + 组件渲染 + 版本兼容
npm run check:pinyin       # 拼音表是否为最新

真实浏览器端到端(需要先跑起一个含三份测试工作区的 DSH 实例):

node scripts/verify-browser.mjs --url "http://127.0.0.1:4401/?token="

它会自己起 headless Chrome,断言 14 项:样式注入、引导弹窗清理、面板打开、8 组查询的精确结果集、↑↓ 光标移动、零页面错误。当前实测输出:

PASS shell paints — the boot graph rendered without a load failure
PASS plugin applies — stylesheet tag is present
PASS onboarding dismissed — first-run dialogs cleared
PASS picker opens — the shadowing occupant replaced the shipped picker
PASS query "" ... PASS query "gz" ... PASS query "gzq" ... PASS query "gongzuo"
PASS query "pp" ... PASS query "folioleenhance" ... PASS query "samples" ... PASS query "zzz"
PASS ArrowDown moves the cursor row — active row is "apple-pie"
PASS no page errors
verified: the picker searched correctly in a real browser

已知边界

  • 只增强这一个下拉。 侧栏那条搜索属于 sidebar.workspaces single 槽,要加同款匹配就得整体接管官方侧栏浏览器(会话分组、拖拽排序、归档、行菜单、目录选择)。官方在查询非空时只渲染它自己判定的命中行,DOM 层也没法把被过滤掉的行加回来——那是另一次独立交付。
  • 多音字按 pinyin-pro 的主读音投影(表里保留其他读音,但候选侧只用主读音)。
  • 工作区标题或路径里出现生僻字(GB2312 之外)时,该字不参与拼音匹配,仍可被子串匹配命中。

License

MIT