dsh-skill-browser 1.8.6 → 1.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,197 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.9 — 2026-10-25
4
+
5
+ ### 新增
6
+ - **零配置 AI 模型自动发现(四段式)**:别人装完插件不用填任何配置,AI 分组/封面就能用。
7
+ 1. 插件配置里显式写了 `provider` + `model` → 直接用(`source: config`)
8
+ 2. 当前对话会话绑定的模型 → `source: agent-session`
9
+ 3. DSH 设置里的默认模型 `agentDefaultModel.currentSelection()` → `source: dsh-default`
10
+ 4. 兜底扫描宿主可用模型目录,取第一个 → `source: llm-catalog`
11
+ - **模型探针徽标**:分组工具条右侧常驻一个小徽标,一眼看出「AI 分组将使用:xxx(DSH 默认模型)」,点一下可重新探测。探测只读配置、**不触发任何模型调用**、不写 `groups.json`。宿主没提供 llm 服务或没选默认模型时,徽标直接变红并给出可操作提示,不用等真分组失败才发现。
12
+
13
+ ### 修复
14
+ - **全皮肤小字可见性(第三次加固)**:
15
+ - `.dsb-gn` 数字徽标原来写死近白色 `--dsb-oncard-dim`,但它同时出现在工具条(面板底)、激活渐变按钮、大类行(深底)三种背景上 → 浅色皮肤下白字白底看不见。改为 **继承父级文字色**,三种背景各自正确。
16
+ - 基础 CSS 里所有 `var(--itm, …)` 文本色统一换成 `var(--dsb-dim, …)`(共 24 处)——皮肤自带的 `--itm` 在 28 款手调皮肤上对面板只有 3.0–4.0:1,达不到 10–11px 小字的 WCAG AA。
17
+ - 品牌渐变底(激活 chip / tab / 排序按钮 / 快捷区间 / 新建分组 / 子类选中)新增**安全渐变对** `--dsb-onbrand-bg1/2`:按「白字 ≥4.6:1」反解,浅色皮肤的淡渐变自动压深;8 款原本 3.03–3.5:1 的皮肤全部达标。
18
+ - `--dsb-ok` / `--dsb-fail` / `--dsb-warn` 作为 10–11px 文本时,按卡片底重新走一遍 4.8:1 阶梯(6 款浅色皮肤原本落在 4.35–4.50)。
19
+
20
+ ### 校验
21
+ - 128 皮肤 × 17 组前景/背景组合 = **2176 项,0 项不达标**
22
+ - 语义色小字专项:1024 项,**0 项 < 4.5:1**
23
+ - 十一套回归全绿:DOM 78 / 热重载按钮 10 / 关键词 17 / 吸顶表头 24 / host 分组 36 / host 热重载 29 / 关键词 host 15 / 模型探针 11(均 0 FAIL)
24
+
25
+ ## 1.9.8 — 2026-10-25
26
+
27
+ ### 新增
28
+ - **分组栏树状 / 平铺双模式**:工具条新增「🌳 树状」「▦ 平铺」切换按钮,选择持久化到 `localStorage.dsh-skill-browser-gmode`。
29
+ - **树状(默认)**:每个大类独占一整行,子类**常驻**缩进挂在该行下方,用 `├─` / `└─` 树枝连接符 + 竖引导线画出真正的层级,一眼看出「Fluent 下面有 画网格 / 后处理 / SpaceClaim 几何操作 …」。不用先点大类才看得见子类。
30
+ - **平铺**:v1.9.3 原样(大类排成卡片,点开才显示子类栏),保留给习惯旧视图的用户。
31
+ - 分组栏顶部改为统一工具条 `dsb-gbar`:分组标题 · 全部 · 未分组 · 🌳树状 · ▦平铺 · ⚡关键词分组 · 🤖AI自动分组 · +新建。
32
+ - 大类行右侧显示「N 项 · N 子类」,鼠标悬停浮出 🎨封面 / +新建子类 / ✏️重命名 / 🗑删除 四个操作。
33
+
34
+ ### 修复
35
+ - **「大类下面子类显示不清、零零散散挨着太乱」**:v1.9.3~v1.9.7 的子类行是 `flex-wrap` 横向小胶囊,和大类卡片视觉上分不开。现改为竖排逐行 + 树枝连接符,层级关系一眼可见。
36
+
37
+ ### 变更
38
+ - 文案键新增 `groupModeTree` / `groupModeFlat` / `groupModeTreeTip` / `groupModeFlatTip`。
39
+ - 新增 CSS:`.dsb-gbar` / `.dsb-gsp` / `.dsb-gtree` / `.dsb-gitem` / `.dsb-grow`(大类整宽行)/ `.dsb-gico` / `.dsb-grname` / `.dsb-grmeta` / `.dsb-grops` / `.dsb-gsubrow` / `.dsb-gline` / `.dsb-gline-last` / `.dsb-gconn` / `.dsb-gsub` / `.dsb-gsub-on`;平铺模式类 `.dsb-gflat` / `.dsb-gcard` / `.dsb-gcard-dom` 全部保留。
40
+ - 分组栏容器 `max-height` 提到 `220px` 并可滚动,分组多时不再挤压技能列表。
41
+
42
+ ## 1.9.7 — 2026-10-25
43
+
44
+ ### 新增
45
+ - **关键词快速分组(⚡)**:分组栏新增「⚡ 关键词分组」按钮,纯本地正则规则直接产出「大类 → 子类」两级方案,**零 token、毫秒级(实测 111 个技能 1~2ms)、结果完全确定**,与 AI 分组共用同一个方案确认弹层和落盘路径(先出方案 → 选「替换」或「追加」才写入 `groups.json`)。
46
+ - 新模块 `lib/keyword-groups.js`:`keywordClassify(skills)` 返回 `{ok, plan:{domains}, stats, mode:"keyword", unmatched}`;另有 `keywordDomains()` / `keywordRules()` / `KEYWORD_MAX_SUB` 供自检与展示。
47
+ - 新接口 `POST /dsh-skill-browser/groups` 的 `action: "kw-classify"`(只出方案不落盘,与 `ai-classify` 同形)。
48
+
49
+ ### 修复
50
+ - **AI 分组「太满」**:单子类技能数硬上限 `MAX_SUB = 8`,超过自动拆成「名称 1」「名称 2」…,保证一屏装得下。
51
+ - 关键词分组对模型未命中/漏掉的技能走 `unmatched` 兜底并归入「其他技能」,**实测 111/111 全覆盖、无重复归属**。
52
+
53
+ ### 变更
54
+ - 文案键新增 `groupKw`(「⚡ 关键词分组」)、`groupKwTip`(「本地关键词规则直接分组:零 token、毫秒级、结果固定」)、`groupPlanTitleKw`(「关键词分组方案」)。
55
+ - `lib/client.js` 的 `kwClassifyFlow()` 与 `aiClassifyFlow()` 并列,共用 `openPlanMenu()` / `applyPlanFlow()`;`S.gplanMode` 区分 `"keyword"` / `"ai"` 只影响弹层标题。
56
+
57
+ ## 1.9.6 — 2026-10-25
58
+
59
+ ### 修复
60
+ - **详情页被吸顶表头穿透**:点技能看全文 / 点台账看失败明细时,排行榜的吸顶表头(`z-index:3`)会浮在详情层(`z-index:2`)之上,正文里横插一条「# 技能 / 版本 / 调用 …」的表格头,干扰阅读。详情层提到 `z-index:20`,彻底压住吸顶表头。
61
+
62
+ ### 性能(不卡顿 / 少内存)
63
+ - **技能卡片分片渲染**:列表一次只渲染 60 张卡,滚动到底自动追加 60 张,也可点「加载更多(还有 N 条)」。切换分类/搜索/排序/分组时自动重置回 60。原来 130+ 技能是一次性拼几千个 DOM 节点。
64
+ - **原始流水分片渲染**:自动登记流水一次只渲染 120 行,点「加载更多」追加 120 行。原来 1000+ 行全量拼串。
65
+ - **重渲染保留滚动位置**:追加卡片时记住 `scrollTop`,不会跳回顶部。
66
+ - **jsonl 增量读取**:`lib/ledger-writer.js` 新增 `autoLogStat()`(只 stat 取 size+mtime)与 `readAutoLogTail(root, n, skill?)`(从文件尾部按行切齐读,不读全文)。`/ledger` 的「最近 30 条」改用尾部读,不再为 30 条记录读整个 986+ 行 jsonl。
67
+ - **统计缓存加 stat 探针**:`/ledger/stats` 的缓存键并入 jsonl 的 size+mtime —— 文件没变时切粒度/改排序都直接命中,且同一份 jsonl 只解析一次(原来换任何参数都要重读重解析全量)。
68
+ - **单技能明细分页**:`/ledger-detail` 默认只回最近 200 条(`&limit=` 可调),并额外返回 `autoTotal`;前端显示「共 N 条(仅显示最近 M 条)」。原来单技能上千条一次性塞给前端。
69
+
70
+ ### 新增
71
+ - 文案键 `cardMore`(「加载更多(还有 {n} 条)」)、`detailHint`。
72
+
73
+ ## 1.9.5 — 2026-10-25
74
+
75
+ ### 修复
76
+
77
+ 1. **调用台账排行榜吸顶表头透明,滚动时与行文字重叠** — 表头(`# 技能 / 版本 / 调用 / 成功 / 失败 / 成功率 / 最后调用`)原来 `background:transparent`,吸顶后下方滚动的行会从表头文字里穿过去,看着像字叠字。现改用新增语义变量 **`--dsb-surface`**(= 行/卡片真实渲染的不透明底色,即面板底色叠加 `--chipBg` 后的颜色),并:
78
+ - `z-index` 2 → **3**
79
+ - 加底部分隔线 `1px var(--dsb-line)` 与 `box-shadow:0 2px 6px rgba(0,0,0,.10)`,滚动时有明确边界
80
+ - 深色/浅色皮肤都取各自的不透明底色(实测 28 月白纸墨 `#f1efeb`、08 极地冰川 `#dfebf4`、04 全息幻彩 `#e7e4fe`、10 机械核心 `#252422`、01 曜石极光 `#252a38`),表头文字对比度 5.54–11.45:1
81
+
82
+ ## 1.9.4 — 2026-10-25
83
+
84
+ ### 新增
85
+
86
+ 1. **面板热重载按钮 ⚡** — 面板右上角新增热重载按钮。改完插件代码点一下,host 半当场换新、client 半刷新页面取最新 bundle,**不重启桌面端、不中断会话**。
87
+ - host 半:`POST /dsh-skill-browser/reload` 用 `?v=<ts>` 重新 import 自身模块(5 个子模块一并换新,绕开 ESM 模块缓存),新的 API 实例接管请求,旧的经 `dispose()` 释放。
88
+ - 生效句柄挂在 `globalThis.__DSB_LIVE__`(`{api, gen}`),跨模块实例共享;每次重载 `gen` 自增,监听器由旧实例的 dispose 摘掉,不会重复注册。
89
+ - client 半:调 `ctx.get("clientModules").rebuilt(id)` 让 client-modules 重新从磁盘读 `client.js`,随后 `location.reload()` 取新界面。
90
+ 2. **热重载探针 `GET /dsh-skill-browser/rev`** — 返回 `{version, gen}`。面板点完热重载后轮询该接口,确认宿主半真的换代(`gen` 变大)再刷新页面,避免刷到旧代码。
91
+
92
+ ### 修复
93
+
94
+ 1. **分组栏 / 台账看板滚动条不可见** — 面板内滚动容器原来用系统 overlay 滚动条,深色面板上几乎隐形。改为常驻 11px 品牌色滑块(轨道 `--dsb-soft`、滑块 `--dsb-brand`、`min-height:40px`、`scrollbar-width:thin`、`overscroll-behavior:contain`),覆盖技能列表 / 台账表格 / 详情正文 / 分组栏四个容器,浅色深色皮肤都看得见位置。
95
+ 2. **悬浮球被面板盖住** — 球 `z-index` 原为 `2147481000`、面板 `2147481100`,面板一开就压住球。现球 `2147483600`、面板 `2147483000`,球恒在面板之上(与 dsh-todo-float-ball / dsh-font-enhancer / dsh-qq-digest 的层级一致)。
96
+ 3. **分组栏过高挤占技能列表** — `.dsb-groups` 加 `max-height:96px;overflow-y:auto;overflow-x:hidden`。
97
+
98
+ ## 1.9.3 — 2026-10-25
99
+
100
+ ### 新增
101
+
102
+ 1. **分组升级为「大类 → 子类」两级结构** — 原来的分组是平铺的一层,AI 分完只会得到一堆并列的组。现在支持逻辑上的总-分关系:一个大类(如「Fluent/CFD 仿真」)下可挂多个子类(前处理 / 画网格 / 求解与监测 / 后处理 / 故障排查),「DSH 工具链」下可挂(启动失败 / 插件冲突 / 插件开发 / 安装经验 / 网关配置)。层级上限两层,第三层会被拒绝。
103
+ 2. **分组卡显示子类数与大类合计** — 大类卡右上角显示「N 子类」,数量是该大类自身成员 + 全部子类成员的合计;点大类看全部,点下面的子类只看那一个。
104
+ 3. **二级子类筛选栏** — 选中某个大类后,分组栏下方出现一条「└ 子类」栏,含「整个大类」+ 每个子类(带计数),点哪个筛哪个。
105
+ 4. **大类卡新增「+」按钮** — 直接在某个大类下新建子类,不必先建组再挪。
106
+ 5. **AI 分组改为「先出方案,确认后落盘」** — 原先是点一下直接写库,模型截断或分得不满意只能删了重来。现在 AI 只返回一份「大类 → 子类 → 技能」方案,在弹层里列清楚(共 N 个大类 / M 个子类 / 覆盖 K 个技能),由用户选:
107
+ - **替换**:清掉旧的 AI 分组,按此方案重建(手工建的分组永远保留)
108
+ - **追加**:保留现有分组,只补还没归类的技能
109
+ 不确认就不写盘。
110
+ 6. **AI 分类提示词按「领域 → 用途」两级重写** — 明确要求大类是领域(Fluent/CFD 仿真、DSH 工具链、软件安装、网关与反代、文档处理…),子类是领域内的具体用途;每个技能恰好归一个子类、一个不漏;单子类 ≤10 个技能;禁止「通用/其他/杂项/综合/工具集」大杂烩筐;不再因为某领域技能多就只细分它。配套三遍覆盖:第一遍全量、第二遍只补模型漏掉的、第三遍按分类标签兜底,保证 100% 覆盖。
111
+ 7. **AI 方案生成失败可读** — 模型流被 max-tokens 截断时不再只说「异常结束」,会带上 failure code/message。
112
+
113
+ ### 修复
114
+
115
+ 1. **滚动条看不见、不知道滚到哪** — 面板内所有滚动容器(技能列表、台账表格、详情正文、分组栏)原来用系统 overlay 滚动条,深色面板上几乎隐形。现在统一常驻 11px 滚动条:轨道半透明、滑块用品牌色(`--dsb-brand`)、最小高度 40px、hover 加深,并加 `scrollbar-width:thin` / `overscroll-behavior:contain`。
116
+ 2. **悬浮球被面板盖住** — 本插件悬浮球 z-index 是 2147481000,面板是 2147481100,面板一开就压住球;而同类插件(dsh-todo-float-ball、dsh-font-enhancer、dsh-qq-digest)球都在 2147483600 以上。现在球提到 **2147483600**、面板提到 **2147483000**,球恒在面板之上。
117
+ 3. **分组栏过高挤占列表** — 分组栏加 `max-height:96px` + 纵向滚动,分组多时不再把技能列表压扁。
118
+ 4. **merge 模式误报失败** — 追加模式下如果所有技能都已有归属,原实现返回「方案里的技能都不在当前技能库中」错误。现在按正常结果处理,返回「所有技能都已在分组里,本次没有需要补的技能」。
119
+
120
+ ## 1.9.2 — 2026-10-24
121
+
122
+ ### 修复
123
+
124
+ 1. **台账看板与分组栏对比度** — 1.9.0/1.9.1 新增的 CSS 全是深色硬编码(`#8fc7ff` / `#9ff5c8` / `#8b93a8` / `rgba(255,255,255,.x)`),浅色皮肤(04 全息幻彩、08 极地冰川、28 月白纸墨等)下白字白底、完全看不清。现在全部改为皮肤语义变量 `--dsb-ok` / `--dsb-fail` / `--dsb-warn` / `--dsb-dim` / `--dsb-soft` / `--dsb-line` / `--dsb-bar` 等,深色皮肤用亮色系、浅色皮肤用深色系。
125
+ 2. **品牌强调色当正文色导致浅色皮肤看不见** — 卡片技能名、排行榜技能名、排序高亮、分组标签原来直接用皮肤品牌色 `var(--stA)`。08 极地冰川(`#f06a5d` 压 `#eef7fd`)只有 2.80:1、04 全息幻彩(`#e0559f` 压 `#f2f0ff`)只有 2.9:1。新增 `--dsb-brand` / `--dsb-brand-strong`:按「同色相逐级加深」的阶梯算出达标色,既保住品牌色观感又能看清。
126
+ 3. **品牌渐变上的标签色** — 激活的 chip / tab / 排序按钮 / 快捷区间 / 新建分组是「品牌渐变 + 白字」,淡渐变上白字同样不可见。新增 `--dsb-onbrand`:按渐变中点亮度自动在白与近黑之间切换。
127
+ 4. **趋势柱 / 迷你条不可见** — 柱状图直接用品牌色,浅色皮肤下 08 极地冰川只有 2.80 / 2.79:1。新增 `--dsb-bar1` / `--dsb-bar2`,按 3:1(非文字图形标准)取达标色。
128
+ 5. **skinColorLum 支持 hsl() / hsla()** — 100 个派生皮肤的颜色是 hsl() 字符串,原先只解析 #rrggbb,导致亮度判定全部落回默认值、浅色判定失效。补齐 hsl → rgb 换算。
129
+ 6. **次要小字改用 --dsb-dim** — 皮肤自带的 --hintC 对面板背景对比度实测仅 3.00~4.02:1(10~11px 小字达不到 WCAG AA 4.5:1),改为按候选链 hintC → itm → ptx → 兜底 取第一个达标的颜色,并按「卡片底」而非面板底核算(小字实际坐在卡片上)。
130
+ 7. **开关开启态标签** — `.dsb-tgl-on` / `.dsb-sw-on` 原用皮肤 `--itD`,浅色皮肤同样是亮色,改走 `--dsb-ok`。
131
+ 8. **日期选择器配色** — 新增 `--dsb-scheme`(light / dark),原生 `<input type="date">` 的日历弹窗在浅色皮肤下不再弹黑框。
132
+
133
+ ### 变更
134
+
135
+ 1. **分组栏改为紧凑单行卡** — 分组卡高度 56px → 30px,名称与数量同行,🎨/✏️/🗑 操作按钮浮到右上角 hover 才显形;12~18 个分组可一屏排完。
136
+ 2. **「全部 / 未分组」改用统一样式的 chip** — 不再用内联渐变 hack,选中态统一走 .dsb-gadd-on。
137
+
138
+ ### 新增
139
+
140
+ 1. **全皮肤对比度自检** — 128 款皮肤 × 14 组前景/背景组合共 1792 项逐一校验(正文 4.5:1、品牌字 4.5:1、次要小字 4.5:1、大数字 3:1、趋势柱 3:1、渐变白字 3:1),当前 **0 项不达标**(20 款浅色皮肤全部通过)。
141
+
142
+ ## 1.9.1 — 2026-10-24
143
+
144
+ ### 重构
145
+
146
+ 1. **失效台账 → 调用台账看板** — 原来的「📋 失效台账」只列人工台账表 + 最近 30 条自动登记流水,看不出调用规模与趋势,改为「📊 调用台账」看板。
147
+
148
+ ### 新增
149
+
150
+ 1. **时间区间筛选** — 7 个快捷区间(今天 / 近 7 天 / 近 30 天 / 本月 / 上月 / 今年 / 全部)+ 自定义起止日期(`<input type="date">`),工具栏右侧实时显示数据的实际覆盖区间。
151
+ 2. **日 / 周 / 月 / 年四种粒度** — 趋势与统计按粒度聚合,周以周一为起点,空洞自动补零。
152
+ 3. **6 个汇总指标卡** — 调用次数、活跃技能数、活跃天数、成功率、失败次数、日均调用。
153
+ 4. **纯 CSS 趋势柱状图** — 按粒度出柱,失败全部命中的柱标红,悬停显示「日期 · 调用 N(成功 X / 失败 Y)」。
154
+ 5. **技能调用排行榜** — 列出每个技能的调用次数、成功、失败、成功率、最后调用时间,并带**版本号徽章**(无版本显示「暂未编版本号」)与相对调用量的迷你条;5 个表头可点击切换排序(调用 / 失败 / 成功率 / 最后调用 / 名称);失败次数 > 0 的技能可点击直接打开该技能的人工台账明细。
155
+ 6. **原始流水折叠** — 人工台账表与最近 30 条自动登记流水收进「展开原始流水」开关,默认收起,看板优先。
156
+ 7. **新增接口 `GET /dsh-skill-browser/ledger/stats`** — 查询参数 `from` / `to`(YYYY-MM-DD)、`gran`(`day|week|month|year`)、`sort`(`calls|fails|rate|last|name`)、`top`;返回 `totals` / `buckets` / `ranks` / `dataFirst` / `dataLast` / `rankTotal`。带 30 秒缓存。
157
+ 8. **新增模块 `lib/ledger-stats.js`** — 纯函数聚合层(无外部依赖):`dayKeyOf` / `weekStartOf` / `normalizeGran` / `normalizeRecords` / `buildStats`。日期按本地时区取日键,避免 UTC 漂移。
158
+
159
+ ### 变更
160
+
161
+ 1. 台账 tab 文案由「📋 失效台账」改为「📊 调用台账」。
162
+ 2. `#dsb-ledger` 由 `display:block` 改为 `display:flex`,内部改为工具栏 / 指标卡 / 趋势 / 排行 / 流水的纵向 flex 布局。
163
+ 3. 台账视图打开时若无统计数据会自动拉取一次。
164
+ ## 1.9.0 — 2026-10-22
165
+
166
+ ### 新增
167
+
168
+ 1. **技能版本号徽章** — 卡片技能名旁显示 `v<version>` 绿色徽章;版本读取顺序为 `SKILL.md` frontmatter 的 `version` 字段 → 同目录 `package.json` 的 `version` 字段;两者都没有时显示灰色「暂未编版本号」。
169
+ 2. **自定义视图分组(手动建组)** — 面板新增「我的分组」横向栏,可手动新建分组(名称 + emoji + 颜色),并支持重命名与删除。分组数据存于 `~/.dsh/data/dsh-skill-browser/groups.json`;**分组只是视图归档,绝不移动或修改任何技能文件在磁盘上的位置**。
170
+ 3. **一键把技能移入分组** — 每张技能卡片底部新增「📁 移动」按钮,点开浮层选择目标分组即可归档;卡片上同时显示当前所属分组标签,也可选择「移出分组」。
171
+ 4. **AI 自动分类建组** — 分组栏新增「🤖 AI 自动分组」按钮,调用 DSH 宿主 llm 服务读取技能库清单(目录名 + 中文简介 + 描述),让模型输出分组方案(每组含名称、emoji、成员技能列表),一次性建好分组并完成成员归档;**只重建 AI 建的组,保留用户手工建的组**。
172
+ 5. **AI 一键生成分组封面** — 每个分组卡片右上角新增「🎨」按钮,调用 llm 生成一段纯 SVG(200x200,深色渐变 + 几何装饰 + 居中符号,无文字),经安全清洗(剥 `<script>`、`on*=` 事件属性、外部 href,上限 40KB)后存入 `groups.json` 作为分组卡片背景图。
173
+ 6. **新增 HTTP 接口** — `GET /dsh-skill-browser/groups`(列出分组 + 技能归属映射);`POST /dsh-skill-browser/groups`(action = `create` / `rename` / `delete` / `assign` / `assign-batch` / `ai-classify` / `ai-cover`)。
174
+ 7. **新增模块 `lib/groups.js`** — 承载分组存储与两个 AI 能力(自动分类建组、分组封面生成)。
175
+
176
+ ### 变更
177
+
178
+ 1. **宿主注入扩展** — `inject` 从 `["webServer"]` 扩展为 `["webServer", "llm"]`。
179
+ 2. **新增可选依赖声明** — `@deepseek-ai/dsh-llm` 声明为 `optional peerDependency`:不安装也能正常使用,只是两个 AI 按钮会提示「AI 不可用」。
180
+
181
+ ## 1.8.7 — 2026-10-19
182
+
183
+ ### 文档与代码对齐(无功能改动)
184
+
185
+ 按源码逐项取证后修正 7 处文档不符:
186
+
187
+ 1. **README:13** — 把「搜索框 + 「全部技能 / 停用」开关」改为「全部技能」**聚合启停滑块**(一键全启用/全停用,或点开批量选择)。代码里没有名为「停用」的筛选控件。
188
+ 2. **README 功能列表** — 补齐 v1.7.0~v1.7.2 整代核心功能「技能启停」:单卡开关 / 分类级聚合滑块 / 全库批量;停用即改写 `SKILL.md` frontmatter 的 `disable-model-invocation`(`scan.js:17,123,163,199`),自动备份 `.bak-toggle`,灰显+徽章(`client.js:129-149`)。中英双语都补。
189
+ 3. **README:28 / :47** — 「16 个一级分类」→ **15**(`lib/zh.js` 的 `CATS.length` 实跑为 15,含 other 兜底)。
190
+ 4. **README:37** — 推荐位由 2 个补为面板 **3 张**卡(多 `dsh-todo-float-ball`,`client.js:699-712`)、DSH 设置页 **4 条**(`client.js:1935-1948`)。原文「设置页不再显示推荐」也不成立,已改。
191
+ 5. **README:38** — 设置页「悬浮球导航」由 2 个开关补为 **3 个**(新增 `📋 Todo 悬浮球`,`client.js:1882`)。
192
+ 6. **README API 表** — 9 条补为 **14 条**:新增 `POST /toggle`(`index.js:450`)、`POST /toggle-batch`(`:456`)、`GET|POST /diag`(`:518`)、`GET /orb/<orb-*.html>`(`:366-367`)。
193
+ 7. **locale/zh.json + en.json** — 删掉无实现的「快速路由 / quick routing」虚标;描述改为覆盖真实功能(悬浮球面板、一级/二级分类、技能启停、失效台账、技能库位置可配置、一键复位悬浮球)。
194
+
3
195
  ## 1.8.6 — 2026-10-14
4
196
 
5
197
  ### 合规性改进(无功能改动)
package/README-zh.md CHANGED
@@ -8,6 +8,160 @@
8
8
 
9
9
  浏览本地技能库、关键词检索、查看技能详情与触发词、快速路由到目标技能。
10
10
 
11
+ ### 全皮肤自适应配色(v1.9.2)
12
+
13
+ 面板支持 128 款皮肤,其中 20 款是浅色皮肤。v1.9.0 / v1.9.1 新增的台账看板与分组栏原先用深色硬编码,浅色皮肤下会白字白底看不清;现在全部改用皮肤语义变量:
14
+
15
+ - `--dsb-ok` / `--dsb-fail` / `--dsb-warn`:成功 / 失败 / 警告三色,深色皮肤用亮色系、浅色皮肤自动切深色系
16
+ - `--dsb-dim`:次要小字专用色,按 `hintC → itm → ptx → 兜底` 候选链取第一个达标色(4.8:1 余量,按卡片底而非面板底核算)
17
+ - `--dsb-brand` / `--dsb-brand-strong`:品牌强调色当**正文**用的版本。技能名、排行榜技能名、排序高亮、分组标签不再直接吃 `--stA`,而是沿「同色相逐级加深」阶梯算出达标色 —— 08 极地冰川原为 2.80:1、04 全息幻彩 2.9:1,现全部 ≥ 4.5:1(大数字 3:1)
18
+ - `--dsb-onbrand`:品牌渐变上的标签色,按渐变中点亮度自动在白 / 近黑之间切换,淡渐变上不再出现白字
19
+ - `--dsb-bar1` / `--dsb-bar2`:趋势柱与排行迷你条,按非文字图形标准 3:1 取达标色
20
+ - `--dsb-soft` / `--dsb-line` / `--dsb-hover`:分隔线、悬停底色
21
+ - `--dsb-scheme`:`light` / `dark`,驱动原生 `<input type="date">` 日历弹窗配色
22
+
23
+ 切换皮肤后无需刷新,配色随皮肤即时重算。128 款皮肤 × 17 组前景/背景组合共 2176 项已全量校验,0 项不达标。
24
+
25
+ > **v1.9.5**:排行榜表头是吸顶的,底色改用语义变量 `--dsb-surface`(行/卡片真实不透明底色),滚动时不会再和行文字重叠。
26
+ >
27
+ > **v1.9.9**:再加固一轮「小字可见性」——
28
+ > - `.dsb-gn` 数字徽标改为**继承父级文字色**(它同时出现在工具条、激活渐变按钮、大类深底三种背景上,写死白色必然有一处看不见)
29
+ > - 基础 CSS 里 24 处 `var(--itm)` 文本色统一换 `var(--dsb-dim)`(皮肤自带 `--itm` 在 28 款手调皮肤上只有 3.0–4.0:1)
30
+ > - 品牌渐变新增安全对 `--dsb-onbrand-bg1/2`,按「白字 ≥4.6:1」反解,浅色皮肤淡渐变自动压深
31
+ > - `--dsb-ok` / `--dsb-fail` / `--dsb-warn` 作为 10–11px 文本时按卡片底再走一遍 4.8:1 阶梯
32
+ > - 语义色小字专项审计 1024 项,0 项 < 4.5:1
33
+
34
+ ### 调用台账看板(v1.9.1)
35
+
36
+ 「📊 调用台账」tab 从原来的失效流水列表改为统计看板:
37
+
38
+ - **时间区间**:7 个快捷区间(今天 / 近 7 天 / 近 30 天 / 本月 / 上月 / 今年 / 全部)+ 自定义起止日期
39
+ - **聚合粒度**:日 / 周 / 月 / 年(周以周一为起点,空洞自动补零)
40
+ - **6 个指标卡**:调用次数、活跃技能数、活跃天数、成功率、失败次数、日均调用
41
+ - **趋势柱状图**:纯 CSS 柱状图,失败全部命中的柱标红,悬停看具体数字
42
+ - **技能调用排行**:调用 / 成功 / 失败 / 成功率 / 最后调用时间 + 版本徽章 + 相对量迷你条;5 个表头可点击切换排序;失败次数 > 0 的行可点开该技能的人工台账明细
43
+ - **原始流水折叠**:人工台账表与最近 30 条自动登记流水默认收起,需要时展开
44
+
45
+ 数据来源是插件自己监听的 `skill` 工具调用结果(`技能失效-自动登记.jsonl`),不额外上报任何东西。
46
+
47
+ ### 技能版本号徽章(v1.9.0)
48
+
49
+ 卡片技能名旁显示 `v<version>` 绿色徽章。版本读取顺序:
50
+
51
+ 1. `SKILL.md` frontmatter 的 `version` 字段
52
+ 2. 同目录 `package.json` 的 `version` 字段
53
+
54
+ 两者都没有时,显示灰色「暂未编版本号」。
55
+
56
+ ### 自定义视图分组(v1.9.0,v1.9.3 升级为两级,v1.9.8 加树状视图)
57
+
58
+ 面板新增「我的分组」栏,可手动新建分组(名称 + emoji + 颜色),并支持重命名与删除。
59
+
60
+ - 分组数据存于 `~/.dsh/data/dsh-skill-browser/groups.json`
61
+ - **分组只是视图归档,绝不移动或修改任何技能文件在磁盘上的位置**
62
+
63
+ **v1.9.8 起分组栏有两种显示模式**,工具条上的「🌳 树状」「▦ 平铺」一键切换,选择记在 `localStorage`:
64
+
65
+ | 模式 | 样子 | 适合 |
66
+ |---|---|---|
67
+ | 🌳 树状(默认) | 每个大类独占一整行,子类**常驻**缩进挂在下层,用 `├─` `└─` 树枝连接符 + 竖引导线画出层级 | 想一眼看全「哪个大类下面有哪些子类」 |
68
+ | ▦ 平铺 | v1.9.3 原样:大类排成卡片,点开才显示子类栏 | 习惯旧视图、分组很多想省纵向空间 |
69
+
70
+ 工具条统一为:分组标题 · 全部 · 未分组 · 🌳树状 · ▦平铺 · ⚡关键词分组 · 🤖AI自动分组 · +新建。大类行右侧显示「N 项 · N 子类」,悬停浮出 🎨 / + / ✏️ / 🗑 四个操作。
71
+
72
+ **v1.9.3 起分组是「大类 → 子类」两级结构**,用来表达逻辑上的总-分关系:
73
+
74
+ - 大类 = 领域(如「Fluent/CFD 仿真」「DSH 工具链」「软件安装」「网关与反代」)
75
+ - 子类 = 该领域内的具体用途(Fluent 下:前处理 / 画网格 / 求解与监测 / 后处理 / 故障排查;DSH 下:启动失败 / 插件冲突 / 插件开发 / 安装经验 / 网关配置)
76
+ - 层级上限两层,第三层会被拒绝;大类行显示「N 项 · N 子类」,数量是该大类自身成员 + 全部子类的合计
77
+ - 点大类看全部,点子类就只看那一个;树状模式下子类一直可见,平铺模式下选中大类后才显示子类栏
78
+ - 大类行上的「+」按钮可直接在该大类下新建子类
79
+
80
+ ### 一键把技能移入分组(v1.9.0,v1.9.3 支持两级)
81
+
82
+ 每张技能卡片底部有「📁 移动」按钮,点开浮层选择目标分组即可归档;浮层按层级缩进列出「大类」与「└ 子类」,技能可以直接挂在大类上,也可以挂到更细的子类;卡片上同时显示当前所属分组标签,也可选择「移出分组」。
83
+
84
+ ### 关键词快速分组(v1.9.7)
85
+
86
+ 分组栏新增「⚡ 关键词分组」按钮,**完全不调模型**:`lib/keyword-groups.js` 用技能目录名的关键词正则直接切出「大类 → 子类」两级方案。
87
+
88
+ - **零 token、毫秒级**:实测 111 个技能 1~2ms 出方案(AI 分组要几十秒且可能被 max-tokens 截断)
89
+ - **结果完全确定**:同一批技能每次分组结果一样,不会今天一个样明天一个样
90
+ - **单子类硬上限 8 个**(`KEYWORD_MAX_SUB`),超过自动拆成「名称 1」「名称 2」,解决 AI 分组「太满」的问题
91
+ - **全覆盖**:未命中关键词的技能归入「其他技能」,不会丢
92
+ - 与 AI 分组共用同一个方案确认弹层:先看方案,再选「替换」或「追加」才写盘,不确认不落盘
93
+
94
+ AI 分组与关键词分组是并列的两条路:想快、想稳定就用 ⚡;想按语义细分就用 🤖。
95
+
96
+ ### AI 自动分类建组(v1.9.0,v1.9.3 改为先出方案再落盘)
97
+
98
+ 分组栏的「🤖 AI 自动分组」按钮调用 DSH 宿主 llm 服务,读取技能库清单(目录名 + 中文简介 + 现分类),让模型输出**两级**分组方案(`大类 → 子类 → 技能`)。
99
+
100
+ **v1.9.3 起 AI 只产出方案、不直接写盘**:方案会在弹层里列清楚(共 N 个大类 / M 个子类 / 覆盖 K 个技能),由用户选:
101
+
102
+ - **替换**:清掉旧的 AI 分组,按此方案重建(手工建的分组永远保留)
103
+ - **追加**:保留现有分组,只补还没归类的技能
104
+
105
+ 不确认就不写盘,分得不满意可以直接取消重来,不用先删一堆组。
106
+
107
+ 分类提示词按「领域 → 用途」两级重写:每个技能恰好归一个子类、一个不漏;单子类 ≤10 个技能;禁止「通用 / 其他 / 杂项 / 综合 / 工具集」大杂烩筐;不再因为某领域技能多就只细分它。
108
+
109
+ v1.9.2 起改为**三遍覆盖式分类**,解决「只分了 Fluent、其他技能全丢进一个杂项筐」的问题:
110
+
111
+ 1. **第一遍**:全量技能交给模型,分组数按规模自动定(技能数 ÷ 8,6~18 组),单组上限 12 个,提示词明确禁止「通用工具 / 其他 / 杂项 / 综合」这类筐,并要求各领域拆分粒度一致。
112
+ 2. **第二遍**:把模型漏掉的技能单独再问一次,并要求避开第一遍已建的分组名,让它们得到真正的语义分组,而不是一个「其他」大筐。
113
+ 3. **第三遍(不调模型)**:仍未覆盖的技能按自身分类标签兜底成组,超过 12 个自动拆成 `名称 1` / `名称 2`。
114
+
115
+ 因此 AI 分组后**不会再出现「未分组」堆积**,全部技能都会落到某个组里。
116
+
117
+ 只重建 AI 建的组,保留用户手工建的组。
118
+
119
+ ### AI 一键生成分组封面(v1.9.0)
120
+
121
+ 每个分组卡片右上角有「🎨」按钮,调用 llm 生成一段纯 SVG(200x200,深色渐变 + 几何装饰 + 居中符号,无文字),经安全清洗(剥 `<script>`、`on*=` 事件属性、外部 href,上限 40KB)后存入 `groups.json`,作为分组卡片背景图。
122
+
123
+ ### AI 能力为可选(v1.9.0)
124
+
125
+ `@deepseek-ai/dsh-llm` 声明为 `optional peerDependency`:不安装也能正常使用全部非 AI 功能,只是两个 AI 按钮会提示「AI 不可用」。
126
+
127
+ ### 零配置模型自动发现(v1.9.9)
128
+
129
+ **别人装完插件不用填任何配置,AI 分组 / AI 封面就能用** —— 插件按四段式自动找「你正在用的那个模型」:
130
+
131
+ 1. 插件配置里显式写了 `provider` + `model` → 直接用(`source: config`)
132
+ 2. 当前对话会话绑定的模型(`ctx.agent.session`)→ `source: agent-session`
133
+ 3. DSH 设置页选的默认模型(`agentDefaultModel.currentSelection()`)→ `source: dsh-default`
134
+ 4. 兜底扫宿主可用模型目录,取第一个 → `source: llm-catalog`
135
+
136
+ 分组工具条右侧有一个**模型探针徽标**,常驻显示「🤖 AI 分组将使用:deepseek-v3(DSH 默认模型)」,点一下可重新探测:
137
+
138
+ - 探测**只读配置,不触发任何模型调用**,也不写 `groups.json`
139
+ - 宿主没提供 llm 服务、或一个默认模型都没选时,徽标直接变红并提示「没找到任何可用模型,请到 DSH 设置 → 模型 选一个默认模型」——不用等真点分组失败才发现
140
+ - 关键词分组(⚡)完全不走模型,任何情况下都可用
141
+
142
+ ### 热重载(v1.9.4)
143
+
144
+ 面板右上角的 **⚡** 按钮:改完插件代码点一下,host 半当场换新、界面刷新取最新 bundle,**不重启桌面端、不中断会话**。
145
+
146
+ - host 半:`POST /dsh-skill-browser/reload` → 用 `?v=<ts>` 重新 import 自身模块(含 5 个子模块),新 API 实例接管请求,旧的 `dispose()` 释放;生效句柄挂在 `globalThis.__DSB_LIVE__`,`gen` 自增,监听器不重复注册。
147
+ - client 半:调 `clientModules.rebuilt(id)` 让宿主重读 `client.js`,随后页面刷新。
148
+ - 探针:`GET /dsh-skill-browser/rev` 返回 `{version, gen}`,面板轮询确认 `gen` 变大后才刷新,避免刷到旧代码。
149
+ - 适用范围:只换本插件代码。改了别的插件、或改了宿主本体,仍需重启桌面端。
150
+
151
+ ### 性能与分片渲染(v1.9.6)
152
+
153
+ 技能库到一百多个之后,原来「一次性把全部卡片和全部调用流水拼进 innerHTML」会明显卡顿、内存也高。v1.9.6 改成按需分片:
154
+
155
+ - **技能卡片**:一次只渲染 60 张,滚动到底自动追加 60 张;也可以点「加载更多(还有 N 条)」。切换分类 / 搜索 / 排序 / 分组时自动重置回 60。
156
+ - **原始流水**:一次只渲染 120 行,点「加载更多」追加 120 行。
157
+ - **追加时保留滚动位置**,不会跳回顶部。
158
+ - **列表是静态摘要**:卡片只显示目录名、中文简介、分类、版本徽章、修改时间;**SKILL.md 全文只在点开详情时才 fetch**(v1.9.0 起就是惰性加载,v1.9.6 保持)。
159
+ - **jsonl 增量读取**:宿主新增 `autoLogStat()`(只 stat 拿 size+mtime)和 `readAutoLogTail(root, n, skill?)`(从文件尾部按行切齐读)。「最近 30 条」不再为 30 条记录读整个 jsonl。
160
+ - **统计缓存加 stat 探针**:`/ledger/stats` 的缓存键并入 jsonl 的 size+mtime,文件没变时切粒度/改排序直接命中,且同一份 jsonl 只解析一次。
161
+ - **单技能明细分页**:`/ledger-detail` 默认只回最近 200 条(`&limit=` 可调),并返回 `autoTotal`,前端显示「共 N 条(仅显示最近 M 条)」。
162
+
163
+ > **v1.9.6**:详情页(点技能看全文 / 点台账看失败明细)里,排行榜的吸顶表头曾浮在详情层之上,正文里横插一条表格头。详情层 `z-index` 提到 20,彻底压住。
164
+
11
165
  ## 🎨 三球共享 128 皮肤
12
166
 
13
167
  本节内容详见 [English README](./README.md)。
@@ -32,6 +186,42 @@
32
186
 
33
187
  本节内容详见 [English README](./README.md)。
34
188
 
189
+ ### v1.9.1 新增台账统计接口
190
+
191
+ | 方法 | 路径 | 说明 |
192
+ |---|---|---|
193
+ | `GET` | `/dsh-skill-browser/ledger/stats` | 调用台账聚合统计(区间 / 粒度 / 排行 / 趋势) |
194
+
195
+ 查询参数:
196
+
197
+ | 参数 | 取值 | 默认 | 说明 |
198
+ |---|---|---|---|
199
+ | `from` | `YYYY-MM-DD` | 空(不限) | 起始日期(含) |
200
+ | `to` | `YYYY-MM-DD` | 空(不限) | 结束日期(含) |
201
+ | `gran` | `day` / `week` / `month` / `year` | `day` | 聚合粒度;周以周一为起点 |
202
+ | `sort` | `calls` / `fails` / `rate` / `last` / `name` | `calls` | 排行榜排序字段 |
203
+ | `top` | 正整数 | `200` | 排行榜返回条数上限 |
204
+
205
+ 返回结构:`{ ok, gran, from, to, sort, dataFirst, dataLast, totals:{calls,ok,fail,rate,skills,days,avgPerDay}, buckets:[{key,label,calls,ok,fail}], ranks:[{skill,calls,ok,fail,first,last,rank,rate}], rankTotal }`。带 30 秒缓存;`from > to` 会自动交换。
206
+
207
+ ### v1.9.0 新增分组接口
208
+
209
+ | 方法 | 路径 | 说明 |
210
+ |---|---|---|
211
+ | `GET` | `/dsh-skill-browser/groups` | 列出分组 + 技能归属映射 |
212
+ | `POST` | `/dsh-skill-browser/groups` | action = `create` / `rename` / `delete` / `move` / `assign` / `assign-batch` / `ai-classify` / `kw-classify` / `ai-apply` / `ai-cover` / `model-info` |
213
+
214
+ `ai-classify` / `ai-apply` / `ai-cover` 需要宿主 llm 服务(`@deepseek-ai/dsh-llm`);未安装时该 action 返回「AI 不可用」。
215
+
216
+ `kw-classify`(v1.9.7)**不需要 llm**:本地正则直接出方案,返回 `{ok, plan:{domains}, stats, mode:"keyword", unmatched}`;方案确认后仍走 `ai-apply` 落盘。
217
+
218
+ `model-info`(v1.9.9)**不调模型、不写盘**:返回 `{ok, provider, model, source, error}`,`source` ∈ `config` / `agent-session` / `dsh-default` / `llm-catalog`。面板用它渲染「AI 分组将使用:xxx」徽标,实现零配置可用性自检。
219
+
220
+ ### v1.9.4 新增热重载接口
221
+
222
+ - `POST /dsh-skill-browser/reload` → `{ok, version, gen, reloading}`;用 `?v=<ts>` 重新 import 自身模块,换掉正在服务的 handler。
223
+ - `GET /dsh-skill-browser/rev` → `{ok, version, gen, ts}`;`gen` 变大表示宿主半已换代。
224
+
35
225
  ## 测试
36
226
 
37
227
  本节内容详见 [English README](./README.md)。
package/README.md CHANGED
@@ -10,7 +10,7 @@ Browse your local DSH skill library straight from the GUI, with an **automatic s
10
10
 
11
11
  ![技能浏览器面板](docs/images/skill-browser-panel.png)
12
12
 
13
- > 技能浏览页:顶部技能总数与生成时间,搜索框 + 「全部技能 / 停用」开关,分类标签一行排开,主体是技能卡片墙(技能名 / 中文简介 / 分类 / 修改时间 / 开关)。
13
+ > 技能浏览页:顶部技能总数与生成时间,搜索框 + 「全部技能」聚合启停滑块(可一键全启用 / 全停用,或点开批量选择),分类标签一行排开,主体是技能卡片墙(技能名 / 中文简介 / 分类 / 修改时间 / 开关)。
14
14
  > Browse view: skill count, search box, category chips, and a wall of skill cards.
15
15
 
16
16
  ### 独门功能:技能失效台账 · Signature feature: the failure ledger
@@ -25,7 +25,8 @@ Did that skill actually work? The plugin listens to DSH's native `tools/result`
25
25
 
26
26
  - **悬浮球 🧩**:固定在屏幕角落,点击开关面板;可拖拽换位置(位置记忆),Alt+点击收起成小圆点
27
27
  - **技能库位置自己定**:首次使用在面板 ⚙ 设置里选择技能库文件夹(弹系统目录选择框),或手动粘贴路径;未配置时自动探测官方默认根 `~/.dsh/skills`。**插件不含任何预设路径**
28
- - **一级/二级分类**:按技能目录名模式自动归类(Fluent/CFD 仿真、DSH 工具链、多端协同、Excel/表格、文档处理、图片/视觉、语音/媒体、数据/可视化、开发/技能治理等 16 个一级分类与 Fluent/DSH 域二级分类)
28
+ - **一级/二级分类**:按技能目录名模式自动归类(Fluent/CFD 仿真、DSH 工具链、多端协同、Excel/表格、文档处理、图片/视觉、语音/媒体、数据/可视化、开发/技能治理等 15 个一级分类与 Fluent/DSH 域二级分类)
29
+ - **技能启停**(v1.7.0 起):单个技能卡片开关 / 分类级聚合滑块 / 全库批量启停(带确认菜单)。停用即改写该技能 `SKILL.md` frontmatter 的 `disable-model-invocation`,改写前自动备份为 `.bak-toggle`,停用卡灰显并带徽章;随时可一键恢复
29
30
  - **中文简介**:技能简介直接取自各技能 SKILL.md frontmatter 的 description(v1.5.0 起插件不内置任何技能名清单/字典,避免泄漏技能库构成,也保证所有人看到的是自己技能库的准确描述)
30
31
  - **搜索**:按技能名 / 中文简介 / 原始描述实时过滤
31
32
  - **详情**:点击卡片查看 SKILL.md 全文,可一键复制
@@ -34,8 +35,8 @@ Did that skill actually work? The plugin listens to DSH's native `tools/result`
34
35
  - **🤖 自动登记**:插件监听 DSH 官方 `tools/result` 事件,自动记录每次 `skill` 工具调用结果——成功记「生效✅」、加载失败记「未生效❌」(含错误信息)
35
36
  - **登记口令**:技能触发失败时,在对话里对 AI 说「触发失败,登记」或「登记失败:技能名 原因」,AI 调用上报接口写入台账
36
37
  - **台账智能发现**:初始化时全库搜索台账文件(文件名含「失效台账 / 失败台账 / 生效-失效」等关键词,约定路径 `skill-master/references/` 优先);搜到就复用,没搜到才创建默认台账 + `skill-master` 技能骨架(幂等,已有人工内容绝不覆盖)
37
- - **推荐插件**:仅面板 ⚙ 设置展开区(技能库位置下方)保留推荐位(照片显示器 dsh-chat-image-lightbox、字体插件 dsh-font-enhancer);v1.5.3 起技能列表每页末尾与 DSH 设置页不再显示推荐(用户反馈心烦)
38
- - **DSH 设置页分区「悬浮球导航」**:在 DSH 设置中即可控制 🧩 技能球 / 🔤 字体球(若安装了字体插件)的显示与隐藏;v1.5.3 新增「🎯 一键恢复悬浮球默认位置(右下角)」按钮——悬浮球被拖出屏幕外卡住时点一下立即复位(清位置记忆/收起状态,无需重启)
38
+ - **推荐插件**:面板 ⚙ 设置展开区(技能库位置下方)保留 3 张推荐卡(照片显示器 dsh-chat-image-lightbox、字体插件 dsh-font-enhancer、Todo 悬浮球 dsh-todo-float-ball);DSH 设置页有 4 条推荐记录;v1.5.3 起技能列表每页末尾不再显示推荐(用户反馈心烦)
39
+ - **DSH 设置页分区「悬浮球导航」**:在 DSH 设置中即可控制 🧩 技能球 / 🔤 字体球(若安装了字体插件)/ 📋 Todo 悬浮球(若安装了 todo 插件)的显示与隐藏;v1.5.3 新增「🎯 一键恢复悬浮球默认位置(右下角)」按钮——悬浮球被拖出屏幕外卡住时点一下立即复位(清位置记忆/收起状态,无需重启)
39
40
 
40
41
  ## 🎨 三球共享 128 皮肤
41
42
  与 dsh-todo-float-ball / dsh-font-enhancer 共享同一套 128 款皮肤目录(window.__DSH_BALL_SKINS,localStorage key dsh-ball-skin)。任一处切换,三个悬浮球与其展开面板实时同步;「原版(仅本球)」可让技能球单独回到原始星云紫。v1.8.x:全部面板控件(含技能详情正文、tab、开关、批量菜单)跟随皮肤,浅色主题文字对比度 WCAG 达标。
@@ -44,7 +45,8 @@ Did that skill actually work? The plugin listens to DSH's native `tools/result`
44
45
 
45
46
  - 🧩 **Floating-ball entry** — pinned to a screen corner, click to toggle the panel; draggable with position memory, Alt+click to collapse to a dot.
46
47
  - 📂 **Configurable skill root** — pick the folder via the native directory chooser in ⚙ settings, or paste a path; auto-detects the official `~/.dsh/skills` root when unset. **No hard-coded paths shipped.**
47
- - 📚 **Two-level categories** — auto-classified from skill directory names (16 top-level categories: Fluent/CFD simulation, DSH toolchain, multi-client collaboration, Excel/spreadsheets, document processing, image/vision, voice/media, data/visualisation, dev/skill governance…).
48
+ - 📚 **Two-level categories** — auto-classified from skill directory names (15 top-level categories: Fluent/CFD simulation, DSH toolchain, multi-client collaboration, Excel/spreadsheets, document processing, image/vision, voice/media, data/visualisation, dev/skill governance…).
49
+ - 🔘 **Skill enable/disable** (since v1.7.0) — per-card switch, category-level aggregate slider, and whole-library batch toggle with a confirmation menu. Disabling rewrites the skill's `SKILL.md` frontmatter `disable-model-invocation` after backing it up to `.bak-toggle`; disabled cards grey out with a badge and can be restored at any time.
48
50
  - 🇨🇳 **Chinese summaries** — taken straight from each skill's `SKILL.md` frontmatter `description`. Since v1.5.0 the plugin ships **no built-in skill dictionary**, so you always see an accurate description of *your own* library.
49
51
  - 🔍 **Live search** — filter by skill name, Chinese summary, or raw description.
50
52
  - 📄 **Full-text viewer** — click a card for the complete `SKILL.md`, with one-click copy.
@@ -94,6 +96,10 @@ DSH 桌面端内置**供应链安全策略**(minimumReleaseAge):刚发布
94
96
  | `POST /dsh-skill-browser/ledger/flush` | 立即落盘队列中的登记 |
95
97
  | `GET /dsh-skill-browser/ledger-detail?skill=<name>` | 该技能的人工明细 + 全部自动记录 |
96
98
  | `POST /dsh-skill-browser/pick-dir` | 弹系统目录选择框(Windows) |
99
+ | `POST /dsh-skill-browser/toggle` | 单技能启停 `{ dir, enabled }`(改写 SKILL.md frontmatter,自动备份 `.bak-toggle`) |
100
+ | `POST /dsh-skill-browser/toggle-batch` | 批量启停 `{ dirs: [...], enabled }`(分类级聚合滑块与全库批量走这里) |
101
+ | `GET/POST /dsh-skill-browser/diag` | 诊断信息(扫描耗时、缓存状态、最近错误) |
102
+ | `GET /dsh-skill-browser/orb/<orb-*.html>` | 悬浮球静态资源(皮肤精灵图等) |
97
103
 
98
104
  技能根目录解析顺序:设置页覆盖(`~/.dsh/data/dsh-skill-browser/config.json`)→ 环境变量 `DSH_SKILLS_DIR` → 插件 config `skillsDir` → `~/.dsh/skills`(官方默认根)。全部未命中时面板提示选择目录。
99
105