xx529/dsh-capability-settings

xx529/dsh-capability-settings

在 DSH Web GUI 中加入能力面板:浏览、安装(上传 / zip / 宿主路径 / URL)、启停、编辑与导出技能,新增与编辑 Claude Code 兼容的 MCP 服务器,覆盖全局与项目双作用域(项目副本、屏蔽占位、默认关闭声明),显示实时挂载状态并提供零副作用连通性探测;会话视图只对当前对话开关能力;「Jev 模型」Tab 用 TypeSafe Jev 按输入草稿为本会话技能与 MCP 打分。需 dsh Web 外壳 0.2.0-rc.2 及以上。fork 自 chengdb/dsh-plugin-capability-panel;与其及 pure-craft/dsh-capability-panel 使用同一 patch id,勿同装。

UI 強化deepseek-harnessdshmcp

dsh-capability-settings

一个 DeepSeek Harness(DSH)插件: 在 Web GUI 里可视化管理项目的全部能力——Skills 与 MCP 服务器,覆盖 全局级 / 项目级(逐工作区)双作用域。安装、启停、内容浏览与分发都能 不离开浏览器完成。

面板还内置 TypeSafe Jev「能力决策」:按当前输入草稿为本会话预选技能 / MCP, 一次请求批量打 0–1 分,可手动点按,也可按输入停顿自动触发(默认关闭)。

界面版本提示:顶部截图是 v7 预览(工作区列表在左导航);文中「技能详情」
「MCP 详情」两张仍是 v6 预览(上一版)——详情区在 v7 未改版式,仅中列/导航变化。
这些截图都不含第三个域 Tab「Jev 模型」与首屏「✦ 能力决策」(v10/v11 新增),
也不含注入技能分组与来源标签(v12 新增);新界面见
docs/figma/preview/v11-*.png(能力决策 5 帧)与并入 v12 的
docs/figma/preview/v8-01/02-*.png、v11-04-results.png(v12 提案原图见 v12-*.png)。
当前 IA 说明见「一个面板,管住三个能力域」「注入技能」与
docs/ux/panel-upgrade.md。
外壳版本要求:侧栏入口用的是 root 作用域的 sidebar.panellist 槽
(「全局面板」图标排)与同 id 的 main keyed 槽,需要 dsh 外壳 ≥ 0.2.0-rc.2
(桌面应用 0.2.0-rc.2 即有;更早的 0.1.2-alpha.2 只有 sidebar.footer.action,
那时入口与主区域面板都不会注册——升级外壳即可)。

它能做什么

能力域 · 浏览/搜索 · 新增/安装 · 编辑 · 启用/禁用 · 删除 · 导入/导出 Skills · ✅ 左导航「全局 / 项目」+ 头部搜索 + 项目按工作区下钻 + 详情(目录树 + SKILL.md 阅读器,预览/源码) · ✅ 上传 / 宿主路径 / URL 三种来源 · ✅ · ✅ 行尾「启用」开关(项目区启停;全局 = 在本项目禁用/恢复)+ 详情页模型/用户方向独立开关 · ✅ 确认对话框 · ✅ 导入到本项目(物理副本)/ 在本项目禁用(屏蔽占位)/ 下载 zip / 复制到宿主目录 MCP 服务器 · ✅ 全局(含外部注入第二组)/ 项目按工作区下钻 + 实时挂载状态 + 行尾「默认」开关 + 工具与参数手风琴 · ✅ 表单新增(stdio/http)+ JSON 导入 · ✅ · ✅ 「默认」开关(新建对话)+ 当前对话开关(会话能力配置)+ 项目条目详情启停 · ✅ 两击确认 · ✅ 导入到本项目(引用,跟随全局)/ .mcp.json 与 Claude Code 格式兼容

上表是两个条目域(技能 / MCP)。面板另有第三个域 Tab 「Jev 模型」:它不是条目管理,
而是 TypeSafe Jev 的全局配置页(第三 Tab 无计数、无搜索、无左导航),并驱动首屏
「✦ 能力决策」。详见下文「Jev 能力决策」。
表中「编辑 / 删除 / 导入」等写操作只作用于本插件受管磁盘目录下的技能;由宿主
registry 注入的技能(DSH 内置 / 插件运行时 / Agent 预设渠道)内容只读,只能
「本项目默认 / 当前会话」启停,详见下文「注入技能」。

配置文件位置

本插件的配置文件写入优先用 `.agents` 目录,读取兼容旧位置与跨工具生态 (例外:Jev 能力决策配置独立存放在 dsh home 的插件目录,见下表末行):

配置 · 写入目标 · 读取兼容(旧位置) 项目级「默认关闭」声明(MCP 面板的「默认」开关 + 注入技能的「本项目启用」开关) · /.agents/capability-overrides.json(mcp / skills 两个列表) · .dsh → .claude 项目级「全局能力引用」声明(MCP 的「导入到本项目」) · /.agents/capability-imports.json · — 全局 MCP 服务器 · ~/.agents/mcp.json · ~/.dsh → ~/.claude Skills(项目/全局) · .agents/skills、~/.agents/skills · .dsh/skills(可写)、.claude/skills(只读展示) 项目 MCP 服务器 · /.mcp.json(Claude Code 标准,位置不变) · — 快捷消息(已下线) · 不再读写 · 旧文件 /.agents/quick-messages.json、~/.agents/quick-messages.json(以及旧位置 .dsh 同名文件)原样保留,不会自动删除;需要清理请手动处理 Jev 能力决策配置(TypeSafe Jev) · /dsh-capability-settings/jev.json(默认 ~/.dsh/dsh-capability-settings/jev.json;目录权限 700、文件权限 600) · 旧目录 ~/.dsh/capability-panel/jev.json 首次读取时自动迁移(rename,幂等);不读写 ~/.agents/jev.json

首次写入新位置时,旧文件内容会自动并入并删除(不丢配置、不留两份)。 .agents 与 .dsh 同时参与"项目根"判定(.claude 也纳入),换目录 / 换 工具搬家都不会影响配置归属。

亮点

🗂 一个面板,管住三个能力域

侧栏上方(品牌/新建会话行之下、工作区列表之上)新增「能力面板」入口, 点击后像「插件 / 自动化任务 / Context」那样占据主区域(不再是浮层,也不 会挤压对话区)。

头部两行:第一行 =「能力面板 · 当前工作区路径 · 项目作用域下拉」; 第二行 = 左侧域 Tab(「技能 / MCP / Jev 模型」;技能与 MCP 带条目数量,形如 「技能 12」「MCP 9」,Jev 模型 无计数)+ 右侧搜索框(只在技能 / MCP 显示, 按域切换 placeholder)。视图内不再有搜索/安装工具条——搜索与添加都收进头部与左导航。 点 Jev 模型 时:第一行的「工作区路径 / 项目作用域下拉」与第二行搜索框隐藏, 内容区为单列配置页(无左导航、无列表 / 详情)。

左导航 = 全局 / 项目:两行,行右侧各有一个「+」用于安装技能 / 添加 MCP 服务器(项目行在未选工作区时置灰,tooltip「先选择工作区」)。

  • 左导航「项目」行下方常驻列出全部工作区(全局 / 项目两种 scope 都显示)——

名称 = 文件夹 basename,title = 完整路径;点击即钉选该工作区,选中行高亮 + 左侧蓝条。工作区多时列表在左导航内自身滚动;没有「‹ 工作区」返回行。 在「全局」scope 下点工作区会自动切回「项目」scope 并钉选。

  • 点 全局:中间列只列全局条目(~/.agents/skills、~/.agents/mcp.json);

MCP 还会在下方显示第二组「外部注入」(运行时注入的只读实例,组头带计数, 为空时不占位)。左侧工作区列表此时仍保留,可直接切项目。

  • 点 项目:中间列显示已钉选工作区的 .mcp.json / 项目技能;未钉选时只给一句

「请选择左侧工作区」(工作区列表在左导航,不占中间列)。头部「项目作用域」下拉 与左导航选择是同一个状态,两边同步。

  • 默认进入「项目」scope;若还没选过工作区,中间列只给一句「请选择左侧工作区」。
  • 切换工作区 / 刷新不闪加载:已有数据时采用 stale-while-revalidate——列表与详情

框架保留、后台静默重拉;只有首次进入(尚无数据)才显示「加载中…」。

  • 搜索只过滤当前可见列表,不跨 scope:未钉选工作区时(任意 scope)过滤

左导航工作区名/路径;已选工作区后左导航保持完整、只过滤中间列条目。技能全局列表 的标题计数在搜索时显示「匹配/总数」。

Jev 模型 Tab 与「✦ 能力决策」为 v10/v11 新增,上面这张 v7 截图不含它们;
新界面见 docs/figma/preview/v11-05-config.png(配置含能力决策)与
v11-01..04-*.png(入口 / 停顿 / 评分中 / 结果)。

📥 Skills:三种方式安装,一键导出分享

  • 浏览器上传:拖入单个 .md、整个 skill 目录、或 .zip 压缩包

(浏览器端 DecompressionStream 解压,零依赖);路径防穿越, 200 文件 / 20MB 上限。

  • 宿主路径:把磁盘上已有的 skill 目录或 .md 复制进受管根。
  • URL 下载:GitHub 仓库(https://github.com//,可带

/tree//)、任意 .zip、raw .md (宿主端 30MB / 30s 限速)。

压缩包/仓库归档自动剥离公共顶层目录并定位唯一 SKILL.md;落盘名以 frontmatter 的 name 为准,同名冲突报错、可选覆盖。磁盘格式与官方 filesystem provider 逐字节兼容(flat .md / 目录型 /SKILL.md),装完立刻可被 agent 调用。安装目标在安装对话框中选定 (「安装到本项目」/「安装到全局」,默认本项目;无工作区时只能装全局)。

导出同样简单:flat skill 直接下载 .md,目录型 skill 在浏览器端打成 store-only zip;也可以复制到宿主任意目录。

⚡ 行尾统一开关:一眼看清、一次点完

v2 把手写文字按钮全部收进详情,列表每行右端只有一个开关(30×18):

  • 技能行 =「启用」:
  • 项目普通条目:开 = 模型与用户均可用;关 = 写入

user-invocable: false + disable-model-invocation: true(一键禁用);

  • 全局条目:开/关表达本项目是否禁用——关 = 生成屏蔽占位

(shadow stub,只影响本项目),开 = 删除占位恢复;

  • 项目屏蔽占位行:拨到开 = 恢复同名全局技能;
  • 置灰不可点:只读来源(.claude)、全局条目已被项目副本遮蔽

(项目副本生效中)、无可用工作区;tooltip 写明原因。

  • MCP 行 =「默认」:开 = 新建对话默认启用,关 = 默认关闭(写项目级

overrides 的 mcp 列表,语义与旧版一致)。外部注入实例同样有该开关 (不可按项目屏蔽时置灰)。

点击开关不改变选中,写后就地静默刷新(失败回滚 + 详情错误条)。 列表圆点:技能仅项目行保留状态圆点(绿 = 双开、蓝 = 部分禁用、灰 = 全禁用、 空心 = 只读/屏蔽占位),全局行用关系标签表达;MCP 的行(含外部注入)都有圆点 (绿 = 已挂载 / 蓝 = 启用未挂载 / 橙 = 默认关闭或冲突 / 红 = 挂载失败 / 灰 = 禁用)。

详情页的动作区则保留完整操作:状态按钮(已启用/已禁用/部分禁用)、 导出、导出到路径…、删除;全局条目多出「安装到本项目」「在本项目禁用 / 恢复」;只读条目只保留导出与复制路径。技能删除走确认对话框(列出作用域 后果,Esc 可取消);MCP 的删除/移出仍为两击确认。调用方式仍可按方向 细调:详情「调用方式」字段上「模型调用」与「用户调用」两个方向各自独立 开关(例如只允许 /name 手动触发、不让 agent 自动注入)。

📖 Skills 详情:目录树 + SKILL.md 阅读器

详情主区域拆成左树右阅读器(目录型技能;flat 单文件技能隐藏树、阅读器占满):

  • 目录树:根目录行 ▾ / → 文件夹行(/ + 文件计数,可展开/收起)

→ 文件行(类型徽标 MD/JSON/PNG… + 文件名 + 大小)。14px 层级缩进 + 1px 引导线,SKILL.md 恒置顶并默认选中;点击任一文件 1 次即切换内容 (一次拉全量后本地缓存,切换不再发请求)。

  • 阅读器:标题为当前文件名(+ 大小/类型),正文可切「预览 / 源码」——

预览走零依赖轻量 Markdown(标题/列表/代码块/引用/分隔线/行内 code 与 粗体;不解析内联 HTML、不加载外链图片、无 dangerouslySetInnerHTML), 源码显示含 frontmatter 的原文。长文件只在阅读器内部滚动。

  • 降级:二进制文件给「无法预览」+ 下载;空文件给提示;单文件超过

256 KB 只预览前 256 KB 并提示下载完整文件;目录最多展示 200 个文件、 树深 3 层(超出截断并提示)。

  • 数据通道:复用既有 skills.export(它已递归返回目录下全部文件的

相对路径 + base64),没有新增宿主 RPC;目录树与内容全部在客户端组树、 解码与缓存。窄容器(内容区 < 632px)时目录树折叠为「文件 (N)」下拉, 阅读器占满宽度。

🗃 Skills:全局 / 项目分离,项目级控制落实为真实文件

技能按来源分进「全局」与「项目」两个 scope(左导航切换;项目的工作区列表也挂在左导航 「项目」行下方),各自按真实文件列举——全局 = ~/.agents/skills 等,项目 = 选中工作区的 /.agents/skills 等。 同名关系直接在行上标出,点击关系标签会切到另一 scope 并选中对应条目 (全局 → 项目时若还没选工作区,会尝试自动进入当前会话工作区):

  • 项目有同名副本 → 项目行 覆盖全局,全局行 项目副本生效中;
  • 全局被本项目禁用 → 全局行 本项目已禁用,项目组出现 屏蔽占位 行;
  • 全局行一律没有圆点(全局技能对所有项目可见),状态由标签与开关表达。

项目级控制全部落实为项目区里的真实文件(副本或屏蔽占位),启停只写 skill 文件自己的 frontmatter,由宿主的文件 watcher + 目录重发布原生生效 (下一步即注入/剔除),没有写在插件私有配置里的叠层状态。

  • 安装到本项目 / 导入到本项目:把全局 skill(目录型连资源)物理复制

到 /.agents/skills,此后在本项目对这份副本的一切控制都是项目级的; 导入是快照,全局后续更新不会同步,项目内同名冲突可选覆盖;