Repository navigation
Releases
v0.3.0 技能分类分组(≤10 类、可折叠)+ 自动生成带路径的技能索引 MD
技能列表按能力分类(≤10 类、可折叠),并自动生成带路径的技能索引 MD 文档。
新增
- 能力分类(≤10 类):扫描时按有序规则给每个技能归入一个能力类别(飞书 / Lark、
DSH / 插件、检索 / 抓取、图像 / 视觉、视频 / 音频、文档 / 表格、内容 / 发布、
自动化 / n8n、开发 / 环境、其他)。规则先匹配技能名(前缀 + 关键词),名字未命中才用
「描述专用别名」兜底;cli/git/search这类通用词不参与描述兜底,避免抢走技能。 - 面板分类分组 + 折叠:技能页签按分类分组,每个分类头可点击折叠 / 展开
(▸/▾ + 分类名 + 数量);折叠状态按设备存 localStorage
(dsh-skill-sidebar:cats:v1,默认全部展开)。搜索在各分类内生效、空分类不显示、
置顶仍排在各分类最前。客户端自带一份与宿主一致的分类兜底规则,服务端未给
category(实时目录条目、或尚未重启的旧宿主)时就地判定,分组始终成立。 - 技能索引 MD 文档(自动同步):每次扫描后重写
skills.md(与skills.json同目录,
默认~/.dsh/storages/dsh-skill-sidebar/skills.md):按分类分组,每行给出
/技能名调用语法、一句话能力与SKILL.md的绝对路径;启动命中缓存时也会重写。 - 接口:
/skillpanel/skills与/skillpanel/skills/refresh新增categories
(分类显示顺序)与docPath;每个技能条目新增path与category。 - 系统规则:
~/.dsh/AGENTS.md新增「四、技能索引文档」——需要找技能 / 快速调用 /
查技能路径时,先读该文档再决定调用哪个技能。
实测
真实技能根目录扫描:94 个技能 / 9 个非空分类(飞书 / Lark 27、检索 / 抓取 37、
开发 / 环境 7、图像 / 视觉 6、内容 / 发布 5、DSH / 插件 3、文档 / 表格 3、自动化 / n8n 3、
视频 / 音频 3、其他 0)。
测试
test-host.mjs:68 项 —— 路径捕获与存在性、分类取值与「≤10 类」上限、skills.md
内容(技能名 / 路径 / 分类标题 / 确定性重渲染)、路由新增字段、分类规则样例。test-client.mjs:分类分组与计数、折叠 / 展开与 localStorage 记忆、默认展开、
合并时继承服务端category/path、搜索过滤后空分类隐藏、分类兜底规则样例。
升级
- Web profile:重新执行
dsh plugin --profile web add <tgz 或 link:...>后重启dsh web并硬刷新。 - 桌面版:link 安装改代码后重启桌面版即可(宿主半部是模块级加载,不随页面刷新热更新;
客户端半部按 Ctrl+R 即可生效)。
v0.2.3 技能面板图标换成素材库图标(斜杠 + 火花)
技能面板图标换成用户选定的素材图标。
变更
- 图标换用素材库图标:标签头 chip、面板标题、「开始」指南页胶囊三处使用的图标,
改为assets/skill-panel.svg—— 取自用户图标素材库的「技能 1.svg」(斜杠 + 两颗火花)。 - 该素材是 1024 单位的填充图标,因此内联时保留原 viewBox(
0 0 1024 1024)并以
currentColor填充,明暗主题下自动跟随文字色;不再是之前的 24 单位描边图标,
描边属性(strokeWidth/strokeLinecap/strokeLinejoin)一并移除。 - 契约测试同步更新:断言 viewBox、
fill="currentColor"、单条 path。
验证
assets/skill-panel.svg与lib/client.js内联的 path 数据与源文件逐字节一致(946 字符、3 段子路径)。node --check lib/client.js、node test-client.mjs、node test-host.mjs全部通过。- 该图标在 16px chip 尺寸下仍清晰可辨(已按 16 / 24 / 32 / 48px 渲染核对)。
v0.2.2 自带 SVG 图标 / 隐藏关闭 X(常开)/ 自动打开更稳
面板外观与默认行为三项调整(客户端侧):
变更
- 自带 SVG 图标:不再借用官方
IconSkillOutline16,改为插件自己的四角星火花图标
(assets/skill-panel.svg,客户端内联为currentColor描边 SVG,自动跟随明暗主题)。
标签头 chip、面板标题与「开始」指南页胶囊三处同时生效;随之去掉已无用的
@deepseek-ai/dsh-client-ui-primitives依赖。 - 隐藏关闭按钮(常开):新增一条作用域受限的 CSS ——
[data-dockkit-tab]:has([data-dsh-skills-chip]) [data-dockkit-tab-close]{display:none!important}。
官方侧边栏的标签元素带data-dockkit-tab、其关闭按钮带data-dockkit-tab-close,
而本插件的 chip 带data-dsh-skills-chip,因此只隐藏技能面板自己的关闭 X,
其他标签页的关闭按钮不受影响。纯 CSS 规则,标签重渲染后自动生效。 - 默认自动打开:
AUTO_OPEN仍为true(每个新会话打开一次),重试窗口由 25 次放宽到
60 次(250ms 起、400ms 间隔,约 24 秒),桌面版冷启动较慢时也不会错过打开时机。
测试
test-client.mjs 新增 6 项契约断言(chip 标记、自绘 SVG、标题文本、常开规则及其作用域),
并移除官方 primitives 桩;node --check、test-client、test-host 全部通过。
安装
# Web profile
dsh plugin --profile web add link:<本包绝对路径>桌面版(Electron 独占 desktop profile)用桌面自带 CLI 载体安装,见 README。
v0.2.1 — 去掉开发机路径,文档与说明改为平台无关
[0.2.1] - 2026-09-12
可移植性修正:去掉源码里只对开发机成立的绝对路径,并把文档与发布说明改成与机器、与平台无关的表述。
修复
- 服务端不再写死某台机器的绝对路径:
lib/index.js里的请求跟踪日志原先硬编码到一个开发机路径,
现已改为默认关闭 —— 只有显式设置环境变量DSH_SKILL_SIDEBAR_TRACE=<绝对文件路径>才会写入。
该写入本来就在try/catch中(在别的机器上只会静默失败、不影响功能),但把绝对路径留在已发布的包
既不合适,也会让人误以为插件依赖它。现在未设置该变量时不产生任何文件系统写入。
变更
- README 的安装示例改为通用写法(
link:<本包绝对路径>),不再出现某一台机器的具体路径;
并新增「平台支持」一节。 - CHANGELOG 的实测清单与升级指引改为与机器无关的表述:profile 补丁路径统一写作
$DSH_HOME/profiles/web/cordis.patch.yml(Windows 默认%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml),
不再描述某次实测的条目数量等本机细节。
平台支持
| 平台 | 状态 |
|---|---|
| Windows 11 | ✅ 已验证(DSH 0.1.5-rc.1) |
| macOS |
插件只用 Node 的跨平台 API(node:path 的 join()、node:os 的 homedir())以及
DSH_HOME / DSH_AGENTS_HOME / DSH_SKILL_DIRS / DSH_SKILL_CACHE_DIR 等环境变量来定位文件,
不含平台专有路径,也不假设路径分隔符。客户端部分只在浏览器中运行,与操作系统无关。
升级到本版本无需改动配置:行为与 0.2.0 相同,只是不再有那个硬编码路径。
v0.2.0 — 迁移到 DSH 官方右侧边栏
[0.2.0] - 2026-09-12
重大更新:从第三方 dsh-better-sidebar 面板迁移到 DSH 官方右侧边栏。
DSH 0.1.5-rc.1 起官方自带可停靠标签页的右侧边栏
(@deepseek-ai/dsh-client-ui-sidebar-right),任何包都能通过公开的两段式接口往里注册标签类型。
本次把「技能」标签整体搬到官方侧边栏,并去掉了对第三方 betterSidebar 服务的依赖。
⚠️ 破坏性变更
- 不再注册到
dsh-better-sidebar:插件不再调用ctx.betterSidebar.registerTab,
插件级inject中也不再有betterSidebar。使用了第三方右侧面板的 DSH 里,技能标签不会再出现在那个面板。 dsh.client.inject改绑官方包:由dsh-better-sidebar改为
@deepseek-ai/dsh-client-ui-sidebar-right。该字段是 boot graph 的包依赖边,
因此升级后必须重启 dsh web(只改lib/client.js则硬刷新即可,见下方「升级指引」)。- 对 DSH 版本有要求:需要 Web 端已内置
@deepseek-ai/dsh-client-ui-sidebar-right的 DSH
(0.1.5-rc.1及以上)。更早的版本没有官方侧边栏,本插件无法注册。 - 两个右侧面板不能同时启用:官方侧边栏与
dsh-better-sidebar同时启用时会互相重叠 ——
better-sidebar 的隐藏 Explorer 行会拦截官方面板上按钮的指针事件(实测「复制」按钮点不动),
官方侧边栏因此无法正常使用。必须停用其中一个(推荐停用 better-sidebar,见「升级指引」)。 - 官方默认页会改变:官方规则是「已注册的指南条目恰好只有一个时直接打开那个页面,否则打开『开始』指南页」。
本插件新增了一个指南条目,因此官方登记的条目数从 1 变 2,空面板的默认页由「工作区文件」变为「开始」指南页。
两者都能从指南页一键进入。
新增
- 官方两段式注册:先在
ctx.sidebarRightTabs.register声明页面类型
(id: 'dsh-skill-sidebar'、kind: 'skills'、priority: 'extension'、title、guide),
再在 keyed 座位sidebar.right.pane.tab与sidebar.right.pane.tab.title下以该id注册主体与标签头。
实现路径与官方@deepseek-ai/dsh-client-ui-sidebar-files完全一致。 - 指南页入口:类型自带一个
guide条目(order: 20、标题「技能」、一行描述、官方技能图标
IconSkillOutline16),官方「开始」指南页出现「技能」胶囊,点击即以replaceTab打开技能页。 - 标签头座位:注册
sidebar.right.pane.tab.title,标签 chip 上显示技能图标 + 标签文字。 - 有界重试的自动打开:官方侧边栏默认折叠且为空,且
ctx.sidebarRight.openTab
在没有挂载的会话座位时会抛错(它不会往没人画的面板里写)。因此按会话做有界重试
(250ms 起、最多 25 次),成功后本次页面加载内不再重复打开,用户手动关闭后也尊重其选择。 - 生命周期接入:主体的 30 秒后台轮询改为由
useTabInfo().tab.visible控制,
并叠加tab.signal.aborted作为退出条件,标签关闭或插件卸载时能干净停下。 - 可断言的 DOM 标记:主体根元素带
data-dsh-skill-sidebar="body",便于验证与排障。
变更
- 组件契约适配:主体组件从
betterSidebar的 props 形态切到官方座位形态 ——
useTabInfo().tab.visible取代props.visible;sessionId取代props.scope.sessionId;
ctx改由座位的inject工厂提供。 test-client.mjs重写:从「模块加载器格式 + 纯函数」扩展到完整契约测试 ——
类型声明、两个座位的注册与 key、inject列表、自动打开的重试与去重、主体在
useTabInfo()下的渲染,以及原有的合并/置顶/缓存等纯函数用例。- README 增补:新增「与官方侧边栏的契约」表(
id/kind/ 优先级 / 指南条目 / 座位 / 两面 inject)
与默认页变化的说明。 cordis.patch.yml注释同步为官方侧边栏口径。
移除
ctx.betterSidebar.registerTab注册路径与betterSidebar依赖。- 隐藏标签关闭 × 的 better-sidebar 专用 DOM hack
([data-dsh-better-sidebar] [title="技能"] > button:last-child{display:none}):
停用 better-sidebar 后该选择器必然失效,官方标签的关闭规则由官方统一管理。
修复
- 测试脚本的相对导入路径:
test-client.mjs与test-host.mjs原先按
./dsh-skill-sidebar/lib/*.js解析,在插件目录内直接运行会ERR_MODULE_NOT_FOUND
(相对导入以文件自身目录为基准,与 cwd 无关)。改为./lib/*.js后,
在插件目录内即可node test-client.mjs/node test-host.mjs。
验证
两套测试均通过:
node test-client.mjs # ALL CLIENT CHECKS PASSED
node test-host.mjs # ALL CHECKS PASSED并在真实 DSH Web GUI(默认地址 http://127.0.0.1:3080)逐项实测通过:
- 标签确实渲染在官方面板内(
[data-dsh-skill-sidebar="body"]位于[data-sidebar-right-panel],
且不在[data-dsh-better-sidebar]内); - 技能列表正常列出,条目数与页脚「本机 / 实时」诊断行一致;
- 搜索过滤、无匹配提示、清空恢复;
- 置顶排到最前并落
localStorage(dsh-skill-sidebar:pins:v1)、取消置顶恢复字典序; - 复制把
/技能名写入剪贴板并显示对勾反馈; - 悬停弹出完整描述浮层,移开后消失;
- 刷新按钮「刷新中… → 刷新」往返并且列表保持;
- 点标签条的
+打开指南页,官方「工作区文件」胶囊与本插件的「技能」胶囊并列出现。
升级指引
-
更新插件源码(或重装
link:依赖)。 -
确认 DSH Web 端已内置官方侧边栏(DSH 安装目录下的
node_modules/@deepseek-ai/dsh-client-ui-sidebar-right存在)。 -
停用第三方
dsh-better-sidebar(可逆,别卸载):在 profile 的 patch 层
cordis.patch.yml中按行 id 禁用 —— 即$DSH_HOME/profiles/web/cordis.patch.yml
(Windows 默认%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml),行 id 取自该插件的 bundle patch:- id: better-sidebar disabled: true
改完先校验 YAML 能解析,再重启 —— profile patch 语法错误会让宿主起不来。
-
重启 dsh web:
dsh.client.inject是 boot graph 的依赖边,只有重启才会重新组合。
重启后硬刷新页面(Ctrl/Cmd+Shift+R)。 -
若仍需第三方右侧面板提供的其他能力(Office 查看器、终端、浏览器视图等),
不要停用它 —— 改为让本插件与它共存,但要接受两个右侧面板重叠、点击被拦截的问题。
回滚:删掉上面那两行 patch 并重启即可恢复 dsh-better-sidebar;
把 lib/client.js 与 package.json 回退到 v0.1.0 并重启即可退回第三方面板版。