dsh-skill-sidebar 技能面板:DSH 右侧边栏技能面板Skills panel—…
32.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lnyuqian/dsh-skill-sidebar该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 22 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-skill-sidebar(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/21 15:44:31
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 37 处,展示前 35 条)
- 读取本地文件lib/index.js:334
const CATEGORY_TABLE = parseTable(readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'categories.json'), 'utf8')) - 读取本地文件lib/index.js:345
const raw = readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'phrases.json'), 'utf8') - 读取本地文件lib/index.js:356
const raw = readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'skills-zh.json'), 'utf8') - 读取本地文件lib/index.js:456
entries = await readdir(root.path, { withFileTypes: true }) - 读取本地文件lib/index.js:473
const info = await stat(mdPath) - 读取本地文件lib/index.js:475
const text = decodeSkillText(await readFile(mdPath)) - 写入本地文件lib/index.js:510
await mkdir(cacheDir(), { recursive: true }) - 写入本地文件lib/index.js:511
await writeFile(cacheFile(), JSON.stringify({ - 写入本地文件lib/index.js:592
await mkdir(cacheDir(), { recursive: true }) - 写入本地文件lib/index.js:593
await writeFile(target, renderSkillsDoc(skills, scannedAt, policy), 'utf8') - 写入本地文件lib/index.js:1296
appendFileSync(REQUEST_LOG, `${new Date().toISOString()} HIT fence=${fence(req)} ua=${(req.headers['user-agent'] || '').slice(0, 160)}\n`) - 发起网络请求lib/client.js:557
return fetch('/skillpanel/skills', { headers: { Accept: 'application/json' } }) - 发起网络请求lib/client.js:586
return fetch('/skillpanel/pins', { - 写入剪贴板lib/client.js:1070
Promise.resolve(navigator.clipboard.writeText(text)).then(function () { finish(true) }, fallback) - 读取本地文件lib/policy.js:89
return normalizeStore(JSON.parse(await readFile(file, 'utf8'))) - 写入本地文件lib/policy.js:99
await mkdir(dirname(file), { recursive: true }) - 写入本地文件lib/policy.js:101
await writeFile(tmp, JSON.stringify(next, null, 1), 'utf8') - 写入本地文件lib/policy.js:102
await rename(tmp, file) - 读取本地文件lib/mining.js:82
const buffer = readFileSync(file) - 读取本地文件lib/mining.js:161
try { entries = await readdir(dir, { withFileTypes: true }) } catch { return } - 读取本地文件lib/mining.js:199
try { info = await stat(file) } catch { continue } - 读取本地文件test-client.mjs:366
const table = JSON.parse(readFileSync(new URL('./lib/skills-zh.json', import.meta.url), 'utf8')) - 读取本地文件test-client.mjs:468
const source = readFileSync(new URL('./lib/client.js', import.meta.url), 'utf8') - 读取本地文件test-desktop.mjs:19
const SRC = readFileSync(new URL('./lib/client.js', import.meta.url), 'utf8') - 读取本地文件test-host.mjs:60
const zhTable = JSON.parse(readFileSync(new URL('./lib/skills-zh.json', import.meta.url), 'utf8')) - 读取本地文件test-host.mjs:118
const handWritten = JSON.parse(readFileSync(new URL('./lib/phrases.json', import.meta.url), 'utf8')) - 读取本地文件test-host.mjs:353
check('skills.md 已落盘', existsSync(internals.skillsDocFile()), internals.skillsDocFile()) - 读取本地文件test-host.mjs:356
const cacheText = readFileSync(internals.cacheFile(), 'utf8') - 读取本地文件test-policy.mjs:15
const TABLE = parseTable(readFileSync(new URL('./lib/categories.json', import.meta.url), 'utf8')) - 读取本地文件test-registry-shadow.mjs:25
for (const profile of readdirSync(base)) { - 读取本地文件test-registry-shadow.mjs:31
return candidates.find((p) => existsSync(join(p, 'lib', 'index.js'))) || null - 读取本地文件test-registry-shadow.mjs:40
return candidates.find((p) => existsSync(join(p, 'package.json'))) || null - 读取本地文件verify-client-modules.mjs:10
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) - 读取本地文件verify-client-modules.mjs:17
console.log('clientPath exists:', existsSync(clientPath)) - 读取本地文件verify-client-modules.mjs:18
const c = readFileSync(clientPath, 'utf8')
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 扫描本机技能目录
- 列出全部技能
- 一键复制调用
展开完整介绍(112 字)↓
dsh-skill-sidebar 技能面板:DSH 右侧边栏技能面板(Skills panel)— 扫描本机技能目录列出全部技能,4-6 字功能短语 + 目录标签 + 一键复制调用 + 置顶 + 默认自动打开 + 每周刷新
README
由 DeepSeek 最新模型翻译生成dsh-skill-sidebar
English:DSH 插件(web 版和桌面版通用),在 DSH 的官方右侧边栏(@deepseek-ai/dsh-client-ui-sidebar-right,DSH 0.1.5-rc.1 新增的可停靠标签页界面)里加一个「技能」标签页。它会扫描本机技能目录(.agents/skills、.codex/skills、.claude/skills、.opencode/skills),列出每个技能,配一句 4–6 个字的短语说明它做什么,还支持一键复制 /skill-name 触发语法、置顶、目录标签、新技能实时重扫、从缓存即时渲染。放进 DeepSeek Harness 桌面客户端(Electron,dsh-app://app/ shell)也能原样运行,只有悬停浮层的位置计算不一样。从 v0.2.0 起,它通过官方两阶段标签页类型 API 注册,不再依赖第三方 betterSidebar 服务;从 v0.3.0 起双 shell 通用(中文说明见下)。
DSH 插件(web 版 / 桌面版通用):在 DSH 官方右侧边栏(@deepseek-ai/dsh-client-ui-sidebar-right,官方新增的可停靠标签页系统)中新增一个「技能」标签页,列出本机可读取的全部技能,并以简短描述介绍每个技能的功能。
展开完整文档(README 剩余 1 节)
dsh-skill-sidebar
English:DSH 插件(web 版和桌面版通用),在 DSH 的官方右侧边栏(@deepseek-ai/dsh-client-ui-sidebar-right,DSH 0.1.5-rc.1 新增的可停靠标签页界面)里加一个「技能」标签页。它会扫描本机技能目录(.agents/skills、.codex/skills、.claude/skills、.opencode/skills),列出每个技能,配一句 4–6 个字的短语说明它做什么,还支持一键复制 /skill-name 触发语法、置顶、目录标签、新技能实时重扫、从缓存即时渲染。放进 DeepSeek Harness 桌面客户端(Electron,dsh-app://app/ shell)也能原样运行,只有悬停浮层的位置计算不一样。从 v0.2.0 起,它通过官方两阶段标签页类型 API 注册,不再依赖第三方 betterSidebar 服务;从 v0.3.0 起双 shell 通用(中文说明见下)。
DSH 插件(web 版 / 桌面版通用):在 DSH 官方右侧边栏(@deepseek-ai/dsh-client-ui-sidebar-right,官方新增的可停靠标签页系统)中新增一个「技能」标签页,列出本机可读取的全部技能,并以简短描述介绍每个技能的功能。桌面版(DeepSeek Harness Desktop,Electron)渲染同一套前端,因此同一份代码两端通用,仅悬停浮层按窗口尺寸自适应。
v0.2.0 起从第三方 dsh-better-sidebar 面板迁移到官方侧边栏;不再依赖 betterSidebar 服务。版本历史见 CHANGELOG.md。
v0.4.0:按插件分类 + 新会话按需加载
要解决的问题(2026-10-12 本机实测):181 个技能里,157 个会被写进每一个新会话的 <available_skills> 目录里 —— 约 44,010 字符 ≈ 14.9K token,而且目录一变就重发一次;可最近 30 天真正被 skill 工具调用过的只有 21 个。
做法:
| 层 | 内容 |
| 分类 | 按「插件/家族」自动归入 12 个分类(lib/categories.json):firecrawl-* → 网页检索、wecomcli-* → 企业微信、photon-* → 多媒体生成、dsh-* → DSH 运维… 规则:人工覆盖 > frontmatter category > 名字前缀 > 关键词打分 > 兜底 |
| 标签 | frontmatter tags/keywords + 名字家族 + 来源根;每行显示「分类 · #标签」 |
| 查询 | 分类筛选条(全部/常驻/索引/新装 + 各分类计数)+ 分组列表;搜索支持 tag:xxx、#xxx、分类:xxx、category:xxx、常驻、索引 |
| 自动归类 | 新装/新发现的技能在扫描时自动归类并落盘(policy.json),零手工步骤;可 POST /skillpanel/classify 人工改写 |
| 使用证据 | 实时:订阅 tools/execute 记录 skill 调用;回填:启动后台扫最近 30 天的多帧 zstd 会话日志,挖出历史调用与「曾进目录」的技能 |
| 加载清单 | 常驻 = 30 天内用过 ∪ 顶标(置顶);30 天内进过目录却没被用过 → 退出新会话目录(转「索引」) |
| 生效方式 | 两级影子:agent 作用域(agent/pre-step 里用该 agent 自己的 skills 实例注册,必命中;v0.4.1 修正)+ 全局层(对启用 host provider 的部署有效)。只关 modelInvocable —— DSH 官方开关,不改 DSH 本体 |
| 索引里仍可用 | 侧栏可见 · /技能名 直接调用 · skill_search 检索并按名加载 |
| skill_search 工具 | 全量索引检索(含被移出目录的技能);传精确 name 直接拿回完整说明并记为一次使用 |
| 分组与折叠 | 分组头即按钮(▾/▸,回车/空格可切换),折叠状态按设备存 localStorage(dsh-skill-sidebar:cats:v1),缺省全部展开 |
| 索引文档 skills.md | 每次扫描重写 skills.json 同目录的 skills.md:按分类分组、每条含 /技能名、一句话能力、SKILL.md 绝对路径与「常驻 / 索引」标注;接口回传 docPath |
| 自有图标 · 常开面板 | 标签头/面板标题/指南胶囊统一用插件自带 SVG(assets/skill-panel.svg,1024 单位 currentColor 填充);本面板的关闭 X 被作用域受限的 :has() 规则隐藏,常驻右栏 |
两点对原始规则的改进:
1. 新装技能 7 天试用期:纯使用过滤会死锁(没用过 → 不列 → 永远用不上),新装/新改的 SKILL.md 先常驻。
2. 证据不足不生效:usage 与 advertised 都为空时(全新机器)整条策略 degraded,只统计不改行为。
v0.4.1 重要修正(分层陷阱):技能注册表是 host + 按作用域分层的,更近的层直接胜出(rank 只在同层内比较)。
本机 standard agent preset 自带 skill-filesystem(全局那个被 dsh-web-app patch 禁用了),所以只注册进全局层的影子会被 preset 层盖掉 —— 表现为「策略算得对、目录一条没少、skill 工具照样能加载索引技能」。
v0.4.1 起改为在 agent/pre-step 里用 该 agent 作用域自己的 skills 实例注册(agent.ctx.get('skills')),并新增自查:注册后按该 agent 视角读一次注册表,结果见 /skillpanel/skills 的 shadow 字段(effective 应为 true)。
开关:DSH_SKILL_POLICY=on|dry|off(默认 on)、DSH_SKILL_WINDOW_DAYS=30、 DSH_SKILL_GRACE_DAYS=7、DSH_SKILL_MINE=on|off、DSH_SKILL_SESSIONS_DIR。
自检:npm test —— test-policy.mjs(55)· test-client.mjs · test-host.mjs · test-desktop.mjs(59)· test-registry-shadow.mjs(12,对着真实注册表验证影子机制)。
注意:宿主 half 的改动要重启 DSH 才生效(link: 安装);重启后新会话的技能目录只列「常驻」那一份,侧栏页脚会显示「加载清单:30 天内用过 + 顶标常驻 · N 常驻 / M 索引」。
功能
- 官方侧边栏标签页:走官方两段式注册 —— 先在 ctx.sidebarRightTabs.register 声明页面类型(kind: 'skills',priority: 'extension'),再在 sidebar.right.pane.tab / sidebar.right.pane.tab.title 两个 keyed 座位下以定义 id 注册主体与标签头。图标为插件自带的 SVG(assets/skill-panel.svg:斜杠 + 火花,内联为 currentColor 填充图标,随明暗主题变化)。
- 指南页入口:类型自带一个 guide 条目,官方侧边栏的「开始」指南页出现「技能」胶囊,点击即以 replaceTab 打开技能页(与官方「工作区文件」同样的公开路径)。
- 默认自动打开:官方侧边栏默认折叠且为空,openTab 会在同一步展开右栏;本插件在每个新会话打开一次(AUTO_OPEN = true,lib/client.js 顶部一个常量即可关闭)。侧边栏座位未挂载时命令会抛错,故做了有界重试(250ms 起,最多 60 次);关闭标签页后本次页面加载内不再自动打开。
- 隐藏关闭按钮(常开):本面板标签页自己的关闭 X 被隐藏
([data-dockkit-tab]:has([data-dsh-skills-chip]) [data-dockkit-tab-close]{display:none!important}),
面板保持常开;其他标签页的关闭按钮不受影响。
- 紧凑排版:每个技能两行展示 —— 第一行技能名(+ 目录标签 + 操作按钮),第二行 4-6 字功能短语;行与行之间以细分隔线隔开,鼠标悬停任意技能行弹出浮层显示完整功能描述。
- 目录标签:非公共目录(.codex / .claude / .opencode)的技能名后跟 #目录 小标签;公共目录 .agents 不加。
- 复制(一键调用):每行「复制」按钮,点击复制 /技能名(带斜杠,DSH 输入框的技能触发语法),粘贴到输入框即可触发该技能。
- 置顶 / 取消置顶(顶标):每行 12px 图钉按钮;点击置顶后该技能排到列表最前(图标变主题色实心),再点取消。v0.4.0 起置顶同时写回宿主 ~/.dsh/storages/dsh-skill-sidebar/policy.json(POST /skillpanel/pins)—— 因为它同时决定「新会话常驻清单」;浏览器 localStorage(dsh-skill-sidebar:pins:v1)只作首帧回退。
- 目录扩展扫描:扫描本机 4 个技能目录 —— .agents/skills(公共)、.codex/skills、.claude/skills、.opencode/skills(后三个均可用环境变量 DSH_CODEX_SKILL_DIR / DSH_CLAUDE_SKILL_DIR / DSH_OPENCODE_SKILL_DIR 覆盖);同名技能以 .agents 优先去重(.claude 的 junction 软链接不重复显示)。各目录类型均支持 $DSH_SKILL_DIRS 追加。
- 短语来源:插件自带 lib/phrases.json(为中文技能手写的 4-6 字短语清单)与 lib/skills-zh.json(为英文 SKILL.md 技能提供的中文短语 + 一句话中文说明,随包分发);两者都没有的新安装技能自动用规则从描述中拆分生成短语(按标点切分、取每段前 6 字、去重、最多 6 条)。解析自动处理 UTF-8 BOM 与 GBK 编码文件。
- 中文化(v0.3.0):本机多数技能的 SKILL.md 是英文,规则短语只能截出 Use when、adding A 这类片段。现在列表第二行显示随包的中文短语(如 网页搜索,整页抓取,资料检索),悬停浮层把中文说明排在最前、英文原文与 whenToUse 保留在后;技能名保持英文原样,因为它就是 /技能名 的调用标识。中文技能沿用 phrases.json 的手写短语,不受影响。
中文表同时由 scripts/sync-zh.mjs 内联进客户端 bundle(lib/client.js 的 @zh-inline 段):客户端 bundle 走 client-hmr 即时重载,而宿主半侧只有重启应用才会重新加载,内联让两端都在改表后立刻显示中文;宿主重启后服务端数据自带 zh,客户端合并是幂等的(两侧同源于 lib/skills-zh.json,一致性由测试断言)。搜索也覆盖中文说明与短语。
- 分类分组 + 折叠(v0.4.0,并入上游设计):面板按分类分组,每个分类头可点击折叠/展开(dsh-skill-sidebar:cats:v1 按设备记忆,缺省全部展开;折叠时不挂载行)。
- 技能索引文档(v0.4.0,并入上游设计):每次扫描后重写 skills.md(与 skills.json 同目录),按分类分组,每条含 /技能名、一句话能力、SKILL.md 绝对路径与「常驻 / 索引」标注,方便智能体先读文档再按名加载;接口回传 docPath。
- 立即列出,无需等待:服务端把技能列表直接注入页面(window.__DSH_SKILLS__),同时持久化到浏览器 localStorage 与会话缓存文件,再次启动打开选项卡即可瞬间渲染,无需网络往返。桌面版例外:Electron 直接读取打包好的前端(dsh-app://app/ 由 serveWebDocument 提供),不经过 webServer 的 index 变换管道,因此该首屏注入在桌面端不生效 —— 桌面端首屏来自 localStorage 快照与实时目录,随后由 /skillpanel/skills 补齐(功能不受影响,只是没有"零请求"那一层)。
- 自动添加新技能:4 个技能目录被 fs.watch 监听(含父目录),新技能安装后自动重新扫描;标签页可见期间每 30 秒后台刷新一次实时目录;缓存随目录集合变化自动失效重扫。
- 每周一重新读取:周一时服务端强制对全部技能做一次全量重读;此后每 6 小时校验一次,若缓存早于当天则再次刷新。
- 桌面版(v0.3.0):同一份代码在 DeepSeek Harness 桌面版里运行 —— 页面挂在 dsh-app://app/ 协议下,相对 fetch('/skillpanel/skills') 由 Electron 主进程带认证 cookie 转发给本地 webserver,槽位注册与数据通道与 web 版完全一致;仅悬停浮层按窗口尺寸自适应(左右夹紧、上下翻转、限高,超出空间的描述截断为省略号),长技能名在窄栏里省略显示而不是把操作按钮挤出可视区,页脚显示当前运行外壳(桌面版 / 浏览器)。
桌面版(DeepSeek Harness Desktop)
桌面版是 Electron 外壳 + 内置本地 webserver,渲染同一套 Web 前端,插件通过 ~/.dsh/profiles/desktop 这个独立 profile 装载(与 profiles/web 互不影响)。
| 项目 | web 版 | 桌面版 |
| profile | $DSH_HOME/profiles/web | $DSH_HOME/profiles/desktop(由 Electron 独占管理) |
| 页面来源 | http://127.0.0.1:<port>(浏览器访问) | dsh-app://app/(Electron 窗口) |
| 插件安装 | dsh plugin --profile web add … | 应用内插件管理(设置 → 插件)或 install-desktop.ps1 |
| 侧边栏契约 | 官方 sidebar.right.pane.tab(.title) + sidebarRightTabs | 完全相同 |
| 数据通道 | fetch('/skillpanel/skills') | 相同(dsh-app:// 下由主进程代理并带认证 cookie) |
| 首屏注入 | webServer.tapIndex → window.__DSH_SKILLS__ | 不生效(Electron 直接读打包前端);首屏用 localStorage 快照 + 实时目录 |
| 差异 | — | 窗口通常更小 → 浮层几何自适应、窄栏技能名省略 |
安装(桌面版已运行时,无需重启):
方式一:应用内插件管理 —— 设置 → 插件,或让 DSH 助手用 plugin_manager 工具安装本次开发即用这条路:安装 link 指向本仓库后宿主热重组,右栏立即出现「技能」标签页
方式二:应用完全退出后,用桌面自带的 CLI 载体安装 pwsh -File .\install-desktop.ps1 # link 安装(开发) pwsh -File .\install-desktop.ps1 -Mode Tarball # 从 tgz 安装(分发) pwsh -File .\install-desktop.ps1 -Uninstall # 卸载
在桌面版里确认已生效:
- 右侧边栏出现「技能」标签页(新会话会自动打开一次),或从右栏「开始」指南页点「技能」胶囊进入;
- 列表底部显示「桌面版」与技能来源(本机 / 实时 / 缓存);
- 服务端缓存落在 $DSH_HOME/storages/dsh-skill-sidebar/skills.json,说明宿主半侧已扫描完成。
桌面版与 web 版共用同一份 lib/:没有平台分叉代码,dsh.client.platform 仍是 "web"(桌面版同样按 web 平台客户端加载,与 dsh-mobile、dsh-quick-prompts 一致)。唯一的实现差异是上面表格里的首屏注入一行:tapIndex 只在浏览器路径上执行。
- 能力分类(≤10 类):扫描时按规则把每个技能归入一个能力类别(飞书 / Lark、DSH / 插件、检索 / 抓取、图像 / 视觉、视频 / 音频、文档 / 表格、内容 / 发布、自动化 / n8n、开发 / 环境、其他),技能名优先、描述兜底;面板按分类分组,每个分类头可点击折叠 / 展开,折叠状态按设备存 localStorage(默认全部展开)。搜索在各分类内生效、空分类不显示、置顶仍排在各分类最前。
- 技能索引 MD 文档(自动同步):每次扫描后把全部技能写成 skills.md(与 skills.json 同目录,默认 ~/.dsh/storages/dsh-skill-sidebar/skills.md):按分类分组,每条含 /技能名 调用语法、一句话能力与 SKILL.md 的绝对路径。启动、装新技能、每周一全量重扫、点面板「刷新」都会重写;~/.dsh/AGENTS.md 已加入「先读该文档再调用技能」的全局规则。
与官方侧边栏的契约
| 项目 | 值 |
| 标签类型 id | dsh-skill-sidebar(同时是主体/标签头注册的 key) |
| 页面 kind | skills(页面类型,不声明 patterns) |
| 优先级 | extension(产品外插件) |
| 指南条目 | order: 20、标题「技能」、一行描述、技能图标 |
| 注册座位 | sidebar.right.pane.tab、sidebar.right.pane.tab.title |
| 插件级 inject | slots、sidebarRightTabs、sidebarRight、connection、sessions |
| dsh.client.inject | @deepseek-ai/dsh-client-runtime、@deepseek-ai/dsh-client-ui-sidebar-right |
标签主体的 props:框架注入的 useTabInfo()(tab.visible 控制 30 秒轮询、tab.signal 限定生命周期)、sessionId,以及本插件通过 inject 提供的 ctx。
注:官方默认页规则是「指南条目只有一个时直接打开它」。加入本插件的指南条目后,官方登记了 2 个指南条目(工作区文件 + 技能),因此空面板的默认页由「工作区文件」变为「开始」指南页;两者都能从指南页一键进入。
数据源
- 实时目录:connection.api.skills.list({ sessionId }) —— 当前会话可见的技能(含内置与用户技能),由 DSH 的 skill 注册表实时提供。
- 本机扫描:GET /skillpanel/skills —— 插件服务端直接扫描技能根目录(~/.agents/skills,可用 $DSH_AGENTS_HOME 与 $DSH_SKILL_DIRS 扩展),解析 SKILL.md 的 YAML frontmatter(name / description / whenToUse / tags / category)。每条技能还带 path(SKILL.md 的绝对路径)、category(分类 id)、tags 与加载清单状态(state:resident 进新会话目录 / indexed 按需);响应体额外给出 policy(加载清单摘要)、categories(分类表与计数)、categoryNames(id → 中文名)、usage 与 docPath(技能索引 MD 的路径)。
- 两份数据按名称求并集合并展示(实时目录优先),因此既能显示会话可调用的技能,也能显示仅用户可调用或机器上其他根目录的技能。
缓存与刷新策略
| 项目 | 位置 | 策略 |
| 服务端缓存 | $DSH_HOME/storages/dsh-skill-sidebar/skills.json(可用 $DSH_SKILL_CACHE_DIR 覆盖) | 启动时若非周一且 7 天内已扫描则直接使用;否则重扫 |
| 技能索引文档 | $DSH_HOME/storages/dsh-skill-sidebar/skills.md(跟随 $DSH_SKILL_CACHE_DIR) | 每次落盘缓存时一起重写:按分类分组,列出 /技能名、能力短语与 SKILL.md 绝对路径 |
| 分类折叠状态 | localStorage dsh-skill-sidebar:cats:v1 | 按设备记住每个分类的折叠状态(默认全部展开) |
| 浏览器缓存 | localStorage dsh-skill-sidebar:cache:v1 | 打开选项卡立即渲染,后台再刷新 |
| 自动添加 | fs.watch(500ms 防抖)+ 5 分钟轮询兜底 | 新技能出现即重扫 |
| 每周一 | 服务端 6 小时定时器 + 客户端周一强制刷新 | 全量重读 |
路由
- GET /skillpanel/skills —— 返回 { ok, skills, categories, docPath, scannedAt, source, policy };skills[] 每项含 name / description / phrases / source / path / category(+ 可选 whenToUse)
- GET /skillpanel/skills/refresh —— 立即重扫、重写技能索引文档,并返回最新列表
两条路由均使用与 /api 网关相同的浏览器信任围栏(loopback Host 或 connection 行的 trustedHosts)。
安装 / 卸载
web 版:把 <本包绝对路径> 换成本仓库在本机的路径(link: 安装,改源码后重启即生效)
dsh plugin --profile web add link:<本包绝对路径>
web 版卸载
dsh plugin --profile web remove dsh-skill-sidebar
桌面版(desktop profile 由 Electron 独占管理,全局 dsh CLI 会拒绝操作):应用运行中 → 设置 → 插件(或 DSH 助手用 plugin_manager 工具),无需重启应用已退出 → 用本仓库脚本 pwsh -File .\install-desktop.ps1 # link 安装 pwsh -File .\install-desktop.ps1 -Uninstall # 卸载
web 版安装/卸载后需重启 dsh web 并硬刷新(Ctrl/Cmd+Shift+R);桌面版通过应用内插件管理安装是热生效的(宿主重组后页面按需加载新 bundle),用脚本安装则在启动桌面版后生效。依赖以 link: 形式指向本目录,改动源码后重启/重载即可生效(无需重新安装)。
平台支持
| 平台 | 状态 |
| Windows 11 + DSH web(浏览器) | ✅ 已验证(DSH 0.2.0-rc.2) |
| Windows 11 + DeepSeek Harness 桌面版 | ✅ 已验证(desktop profile;两段式注册与 host 路由实测生效) |
| macOS | ⚠️ 未测试 |
插件只用 Node 的跨平台 API(node:path 的 join()、node:os 的 homedir())与 DSH_HOME / DSH_AGENTS_HOME / DSH_SKILL_DIRS / DSH_SKILL_CACHE_DIR 等环境变量定位文件:没有平台专有路径,也不假设路径分隔符(技能根目录一律用 join() 拼接)。客户端部分只在 Web 运行时(浏览器或桌面版 Electron 渲染进程)里运行,与操作系统无关,也不区分两种外壳 —— 只有浮层几何按窗口尺寸自适应。
可选的请求跟踪日志默认关闭,需显式设置 DSH_SKILL_SIDEBAR_TRACE(见「路由」)。
开发
客户端契约测试(官方两段式注册、自动打开重试、主体渲染、合并/缓存/置顶)
node test-client.mjs
服务端逻辑测试(frontmatter 解析、扫描、路由、watcher、缓存)
node test-host.mjs
桌面版适配测试(外壳识别、浮层几何、桌面端槽位注册端到端)
node test-desktop.mjs
改了 lib/skills-zh.json 之后,把它重新内联进客户端 bundle(否则客户端仍是旧表)
node scripts/sync-zh.mjs
三套一起
npm test
lib/client.js 使用 DSH 客户端模块表格式(window.__ModuleLoader__.load),手写无需构建;lib/index.js 为纯 Node ESM,无第三方依赖。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
lnyuqian/dsh-skill-sidebar
dsh-skill-sidebar 技能面板:DSH 右侧边栏技能面板Skills panel—…
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,928已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目