Repository navigation
Releases: a735624258/dsh-skill-picker
Release list
v0.5.28 — 新置顶进最前(修置顶顺序)
一句话
新置顶的技能现在排到「置顶」分组的第一行,和微信 / Notion 的置顶行为一致。
为什么要改
后置顶的技能排在了「置顶」分组的最后一行 —— 主流应用(微信 / Notion)都是「刚置顶的进最前」,所以这是 bug:写入侧 togglePin() 用的是 [...pinned, name](追加到末尾),而渲染侧直接按数组顺序输出「置顶」分组。
改了什么
- 写入侧从「追加到末尾」改成「插到最前」:
[name, ...pinned] - 渲染侧不动 —— 它本来就是按数组顺序渲染,所以一行修复就够了
怎么验证
npm test→ 88 tests / 87 pass / 1 skipped / 0 fail- 实机:取消一个已置顶的技能 → 重新置顶它 → 出现在「置顶」分组第一行
- 备注:已在置顶列表里的旧顺序不会自动重排(存的是老的追加顺序),想调整顺序就「取消 → 重新置顶」
- 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.28
v0.5.27 — 手机端光标豁免牌(配合 dsh-pocket「切会话不抢焦点」补丁)
一句话
手机上选完技能,光标照常回到输入框 —— 与 dsh-pocket 的「切会话不抢焦点」补丁配套。
为什么要改
dsh-pocket 新补丁把「程序自己抢的焦点」一律退回,而本插件的 focusComposer() 本身就是有意为之的主动聚焦(选完技能就该把光标放回输入框)→ 于是「插完技能光标不回来」在手机上复发。
改了什么
focusComposer()在聚焦前写一个时间戳:window.__dshSkillPickerFocusing = Date.now()- 拦截器看到 1.2 秒内的这个时间戳就放行
- 用时间戳而不是布尔值:紧随其后还有一次 60ms 的守卫重定位,一次设值同时覆盖两次聚焦,也不需要清理、不会漏复位
怎么验证
npm test→ 88 tests / 87 pass / 0 fail⚠️ 两个补丁是一对:只装本插件 → 手机上「切会话仍会抢焦点」;只装 pocket 侧 → 「插完技能光标不回来」;两边都装才两个都对- 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.27,装完重启 DSH
v0.5.26 — ⚡ 面板可管理技能 + 12 项细节修复
一句话
⚡ 面板里右键(手机长按)就能管理技能:置顶 / 关闭 / 在文件管理器中定位 / 卸载(可撤回)。
为什么要改
官方 DSH 没有任何技能管理界面 —— 把 asar 里 289 个官方包全扫过一遍,没有禁用 / 卸载技能相关代码,而社区里也在问「能不能加技能管理(删除 / 加 / 启动 / 关闭)」。这块是真空白。
改了什么
- 右键技能行(手机长按 500ms,滑动即取消)弹菜单:置顶 / 关闭 / 定位 / 卸载
- 「关闭」是真关闭:
SKILL.md→SKILL.md.disabled,provider 直接看不见、agent也不再加载;从右下角「已关闭 N」入口随时开回来 - 「卸载」从不删除:移进
$DSH_HOME/skill-backups/<时间戳>-<技能名>/(附manifest.json记原路径),面板里出现「撤回」 - 12 项细节修复(全部来自实机反馈):光标落回输入框末尾、右键菜单跟随主题且实心、提示条自动消失(普通 2.6 秒 / 带撤回 10 秒)、字体统一到
--dsw-font-family、去掉全部 emoji、修「已关闭的技能仍出现在主列表」、搜索框无边框 32px - 路由三道闸:必须带自定义头
x-dsh-skill-picker: 1;客户端只报技能名、路径由宿主自己查;路径必须恰好落在已知技能根的一层之下
怎么验证
npm test→ 88 tests / 87 pass / 0 fail- 实机(全程只用自建假技能):关闭后磁盘上是
SKILL.md.disabled✓、扫描仍能列出且disabled:true✓、开启还原 ✓、卸载后备份里SKILL.md+manifest.json完整 ✓、撤回回原位 ✓、不带自定义头 → 403 ✓、name塞../→ 404 ✓ - 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.26,装完重启 DSH
v0.5.22 — 置顶跨端共用一份 + 修「/ 菜单开到下面去」+ 文件补丁退休
一句话
置顶与最近使用在桌面端 / 网页端 / 手机之间共用同一份;顺带修掉「打 / 菜单开到下面去」,并让文件补丁正式退休。
为什么要改
localStorage 按源隔离 —— 桌面端是 dsh-app://app、网页端是 http://127.0.0.1:3080、手机连上去又是第三个源,同一份数据被存了三遍,所以在桌面端钉的技能网页端永远看不到。
改了什么
- 状态改存宿主侧
$DSH_HOME/dsh-skill-picker-state.json,host 新增/dsh-skill-picker/state(GET / PUT);首次同步取并集(谁也不会吃掉谁的钉子),之后跟随文件,所以在 A 端取消置顶能真的传播到 B 端 /菜单的空查询也交给同一套排序(以前空查询被短路 → 纯字母序、置顶不在最前);⚡ 面板与/菜单从此同源同序- 修「打
/菜单开到下面去、高亮不在第一条技能」:这是 microtask 跳数的比赛,不是网络快慢 —— 技能组必须命中自己的缓存、0 个await直接返回才抢得到高亮 - 文件补丁退休:默认不再改任何官方文件,并自动把以前改过的从
.bak还原(temp + rename,绝不动 pnpm 硬链接的共享 inode);只有显式设DSH_SKILL_PICKER_FILE_PATCH=1才走旧的自愈路径
怎么验证
npm test→ 75 tests / 74 pass / 0 fail(1 skip 是 Windows 建符号链接需权限那条)- 全程 best-effort:host 不可达时行为和以前完全一样,不会因为同步失败把选择器弄坏
- 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.22,装完重启 DSH
v0.5.10 — 修复全局安装下 / 补全增强静默失效(issue #7)
一句话
用全局 npm i -g @deepseek-ai/dsh 安装时,/ 补全的模糊 + 拼音增强不再静默失效。
为什么要改
对应 issue #7(感谢 @aizhimoran 的报告:根因、证据、修法全都给了)。官方包在共享根 $DSH_HOME/profiles/node_modules/...,而候选路径只枚举了 profiles/<profile>/... 两处 → 一个都没命中 → 补丁一次都没跑,而且完全无声:{"files":[],"errors":[]} 与「补丁都已应用、全部 skipped」在输出上一模一样。表现成「插件一切正常、技能列表能用,就是拼音 / 模糊搜索是坏的」。
改了什么
- 候选新增共享根
profiles/node_modules/...(不属于任何单个 profile,放在 profile 循环外采集) - 每个 profile 额外走一次
createRequire().resolve()兜底,未枚举到的布局也能命中(按 realpath 去重) - 跳过
profiles/node_modules这个假 profile 条目 - 零目标时
console.warn大声报出 —— 这个静默正是 issue #7 里最坑人的地方 - 写入方式改为临时文件 +
rename:pnpm 装的包是硬链接到共享 store 的,原地写会连带改动 store 里的同一份;rename只替换目录项,顺带获得原子性
怎么验证
- 新增 6 个用例(
test/patch-paths.test.mjs):共享根 / profile 内 local / profile 内 node_modules / 三种同时存在去重为 1 / 什么都没装 /profiles目录不存在 - 全量:11 通过 / 0 失败 / 1 跳过
- 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.10
v0.5.7 — 🔍 搜索结果按匹配相关度排序
一句话
搜索结果按匹配相关度排序:名字开头匹配 > 名字包含 > 描述命中 > 拼音命中。
为什么要改
/ 菜单之前用 fuzzysort 只决定"谁匹配",排序仍按最近使用 —— 于是名字完全匹配的 svg-diagram 会被最近用过的技能压到后面。
改了什么
- 相关度优先;置顶 / 最近使用只做同级内的次序
- 过滤纯字母分散的子序列噪音:搜
svg不再混入 deepseek / openviking 这类恰好含 s、v、g 三个分散字母的技能 - ⚡ 面板与
/补全统一同一套规则
怎么验证
- 搜
svg→svg-diagram稳居第一 - 拼音搜索不受影响:
ji yi/duo xuan/beifen正常命中 - 安装:
dsh plugin --profile web add dsh-skill-picker@0.5.7,装完重启 DSH
v0.4.0 — 单列表模糊搜索(patch 官方 ui-skill)
一句话
/ 菜单里的技能列表换成模糊 + 拼音匹配,而且官方「技能」分组仍然是唯一那个列表。
为什么要改
v0.2.0 – v0.3.4 注册了一个独立的 / 候选源,与官方列表并列 —— 菜单里出现两个技能分组、搜索行为互相冲突。
改了什么
- 不再注册独立源,改为增强官方
dsh-client-ui-skill的 candidates:把前缀匹配(startsWith)升级为模糊 + 拼音(fuzzysort + pinyin-pro + 最近 / 常用排行) - 官方规则全部保留:
userInvocable区分、菜单文案、「仅用户可调用」等都由官方代码继续管 - 当时的部署方式(后来已废弃):官方包拷到
profiles/<profile>/local/dsh-client-ui-skill/,profile 的package.json加link:,pnpm install后重启 DSH
怎么验证
/jiyi→backup-memory(备份记忆)排第一;/duo xuan→duo-xuan-pi-gai- 无第二列表、无搜索冲突
- 安装:
dsh plugin --profile web add dsh-skill-picker@0.4.0 ⚠️ 这条「改官方文件」的路线自 v0.5.15 起已被「运行时接管」取代 —— 现在默认不改任何官方文件
v0.3.4 — 适配 DSH alpha.5:remote.skills + inputTriggers
一句话
跟着 DSH 0.1.2-alpha.5 的改名走:技能列表切到 remote.skills,/ 的模糊 + 拼音搜索恢复。
为什么要改
rc.x 里的 connection.api.skills 在 alpha.5 改名成 remote.skills → 取不到技能列表,/ 的模糊 / 拼音搜索直接失效。
改了什么
- 技能列表改用官方
remote.skillsRPC(与官方 ui-skill 同源),同时保留connection.api.skills兼容 /补全与 ⚡ 面板统一为「官方 RPC → host 扫描兜底」的降级链dsh.client.inject里声明@deepseek-ai/dsh-client-ui-input-trigger—— alpha.5 的装载器只给声明了提供者的插件暴露inputTriggers服务
怎么验证
- Playwright 实测:输入
/jiyi→ 技能分组正常弹出,backup-memory(备份记忆)排第一 ✓ - 安装:
dsh plugin --profile web add dsh-skill-picker@0.3.4,装完重启 DSH
v0.3.3 — 兜底扫描对齐官方技能根(issue #5)
一句话
兜底扫描补上 user-agents 层,扫描顺序与官方 rank 完全一致。
为什么要改
官方 skills API 不可用时会走兜底扫描,但当时漏了 ~/.agents/skills 这一层 —— 放在那里的技能在 ⚡ 面板里一支都看不到(对应 issue #5)。
改了什么
- host 的
scanSkills对齐官方dsh-skill-filesystem的全部技能根:<cwd>/.dsh/skills、<cwd>/.agents/skills、~/.dsh/skills、~/.agents/skills($DSH_AGENTS_HOME可覆盖) - 扫描顺序与官方 rank 一致:project-dsh > project-agents > user-dsh > user-agents
- 走兜底时 ⚡ 面板显示「本地扫描」来源徽标,方便排障
- README 的兜底扫描范围同步更新
怎么验证
- 把技能放进
~/.agents/skills,面板能列出(之前列不出) - 同名技能同时存在时,项目级覆盖用户级
- 安装:
dsh plugin --profile web add dsh-skill-picker@0.3.3
v0.3.2 — 📄 安装文档实测修正
一句话
三种安装方式逐条实测过一遍,把踩到的坑写进文档。
为什么要改
README 里的安装说明此前没有实测依据 —— 照文档装可能直接失败,或者装到旧版还找不到原因。
改了什么
- 方式一
clone + link:✅ 有效(以本机 link 模式为证) - 方式二
github:简写:⚠️ 实测 pnpm 会强制 HTTPS clone,HTTPS 受限环境(如只有 SSH 通道)会失败 → 补上git+ssh://替代写法 - 方式三 npm 裸名:
⚠️ 新版本发布后 24 小时内会被 pnpm 的minimumReleaseAge门禁挡到旧版 → 补上dsh-skill-picker@版本号的写法
怎么验证
- 三种方式各跑一遍,结果逐条记进 README
- 纯文档改动,无代码变更