跳到主要内容

dsh-s-m-c-center

已验证

dsh-s-m-c-center · v0.2.5 · MIT · Web 界面

Skills, MCP & CLI manager for the dsh web GUI: browse/enable/import/delete skills across project and user roots; manage MCP servers with a REAL connection through @deepseek-ai/dsh-mcp-client (enabled servers connect and register their tools on ctx.tools;

安装

dsh plugin add dsh-s-m-c-center

用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。

源码

标签

说明文档

🌏 中文 · English

三合一工具台 · dsh-s-m-c-center

把智能体的「技能 / MCP / CLI」三类工具收进 DeepSeek Harness 的同一张设置页,
并让每个对话按需注入自己的技能。


技能联接 · 会话注入 · 影子目录 · MCP 真实连接 · CLI 探针 · 中英双语 · 零源码侵入

release stars forks npm 总下载量 license: MIT dsh node

它是什么 · 界面一览 · 功能亮点 · 两条通道 · Agent 工具 · 架构 · 安装 · 配置 · 权限声明 · 开发 · 许可

工具管理设置页:Skills 技能页签

「设置 → Web UI 插件 → 工具管理」:统一储存库、技能联接与「会话默认」,三个页签分管三类工具。

[!NOTE] 0.1.2 起技能目录由本插件接管(影子目录):目录成员严格跟着会话的注入选择走;目录有变化才发一条替换帧,不再每步追加;容器目录(只有 DESCRIPTION.md)可注入、可加载。已经过三轮外部实测(16/16 通过)。

✨ 它是什么

中文别名:三合一工具台 | 别名:工具管理、工具中心、技能管理、MCP 服务器管理、CLI 工具管理、Skills / MCP / CLI 管理器

一个自包含的 DSH Web 插件:在设置页新增一个一级页面,统一管理 agent 的三类工具(技能 / MCP 服务器 / 本地 CLI),并新增一层按对话生效的技能注入;另有一个使用说明页,讲清三者各自的工作方式,并在最下方负责把它们干净地还回去。

能力 原生 dsh web 装上本插件后
技能浏览 / 启停 到技能目录手动增删 设置页一键联接 / 断开,正本统一入库,SKILL.md 一字不改
会话级技能组合 — 会话默认 + 侧边栏小窗 + skill_select,每个对话只存与默认的差异
技能目录(AI 视角) 静态目录扫描 影子目录:严格跟随会话选区,附 smc-skill-index 索引行
MCP 服务器 手编 mcp.json 表单 / JSON 新建 + 一次性测试连接 + 激活 / 归档开关
本地 CLI — 自动发现 skill 内嵌 CLI,登记系统 CLI,探测安装 / 版本 / 子命令 / API-Key
侵入性 — 零源码改动:一个 npm 包 + 一行 profile bundle patch
页签 管理 底层
Skills 技能 浏览 / 启用 / 不启用 / 删除 / 导入技能;**「会话默认」**决定新对话起始注入哪些技能 用户级走 ~/.dsh/S-M-C/skills 正本 + 目录联接;项目级改写 SKILL.md 前言
MCP 服务 新建 / 编辑 / 测试 / 激活 / 归档 / 删除 MCP 服务器 真实 @deepseek-ai/dsh-mcp-client 连接(mcp__<server>__<tool>);归档移入 S-M-C/mcp-archive.json
CLI 工具 发现 / 探测本地 CLI 工具;登记系统 CLI skill 内嵌 scripts/run-cli + S-M-C/cli.json
使用说明 三类工具各自的工作方式,以及卸载前的准备 说明集中在此页;卸载准备在最下方

完整说明见 docs/功能介绍.md、docs/架构.md。

📷 界面一览

会话技能小窗 | 侧边栏随手调整本对话的注入 MCP 服务 | 真实连接,激活 / 归档一键切换
侧边栏「会话技能」小窗 MCP 服务页签
CLI 工具 | 发现 / 探测 / 登记本地 CLI 使用说明 | 三类工具讲解 + 卸载撤退口
CLI 工具页签 使用说明页签

截图中的技能名、描述与 MCP 服务器信息已打码。

💡 功能亮点

  • 技能:按项目级 / 用户级与来源分组(.dsh/skills、.agents/skills、~/.dsh/skills、~/.agents/skills)。用户级技能迁入统一储存库 ~/.dsh/S-M-C/skills,项目级技能就地管理、仍用前言开关。删除为两步确认的物理删除。点开可看详情(description / whenToUse / 正文);支持从任意目录扫描导入。

    操作 底层动作
    启用 / 不启用 在技能根目录注入 / 移除目录联接(SKILL.md 一字不改)
    删除 只删储存库里的正本(见下),不碰库外目录

    技能根目录里的东西一项不漏地列出来,包括不是技能的。 没有合格准入文档(SKILL.md / DESCRIPTION.md)的目录会标红为 非法技能 并说明原因,一律不可启用:

    状况 显示 为什么不往下钻
    目录里没有准入文档 标红 非法技能 dsh 只认技能根目录一层,埋在 <根>/<分类>/<技能>/ 里的技能对它本来就不存在;列出来只会让人以为够得着
    登记记录的正本没了 标 ⚠ 正本已失效 见下条
  • 溯源可查的登记表:「溯源刷新」分两步,因为"这条记录没用了"和"它指向的正本坏了"要做的事完全不同。

    步骤 判定 结果
    ① 比对当前技能列表 列表里没有对应行的 = 孤条记录(典型来源:在别的项目目录下扫描时登记的项目级技能) 直接从登记表清掉——它们显示不出、联不上、加载不了,留着只会把真问题埋掉
    ② 核对正本 列表里确实有行的,才查路径还在不在、里面是否仍有技能 失败写进登记表(missing 字段,带时间与原因)并在列表标 ⚠ 正本已失效

    正本核对失败会持续显示为坏的,而不是下次打开又显得正常、还提供一个根本联不上的「联接」按钮。清理了几条孤条记录也会一并告诉你。

  • 会话默认与按对话注入:会话默认 是新对话的起始技能;每个对话还能有自己的差异(关掉某个、追加某个)。对话里的 agent 可以自己开关(写入该对话自己的配置),侧边栏还有一个「会话技能」小窗供你随时手动调整——两处列表都只列已联接的技能。详见下一节。

  • MCP:分「管理 / 新建」两个子页——管理页一台服务器一个 激活 / 归档 开关(外加删除),新建页提供表单或 JSON 编辑,保存前可测试连接(一次性真实探测);激活 / 归档真实连接 / 断开并注册 mcp__<server>__<tool> 工具;实时状态(连接中 / 运行中 / 失败 / 已停止)。

  • CLI:自动发现 skill 包装的 CLI(scripts/run-cli.* / cli-state.*),并登记系统 CLI(gh、git …,存于 S-M-C/cli.json)。每条都会探测:是否安装 / 版本 / 是否需更新 / API-Key 状态 / 子命令,并在行上标出来源与位置。公告 / 隐藏开关只决定是否把这个 CLI 写进给 AI 的公告(插件无法启停系统装的 CLI,因此默认隐藏)。

  • 使用说明:按三类讲清工作方式,最下方是卸载前的总撤退口。「撤销迁移」把储存库技能移回原始位置;储存库空着时同一按钮变为绿色的「迁移」,双向可逆;「MCP 全部注入」把归档服务器一次性移回并重连;页面同时列出卸载后需手动删除的目录与配置块。

  • 界面:全量文案 zh / en 双语(各 206 键,英文环境零中文);破坏性操作两步确认,且点开别处即复位。

🧠 两条通道:联接 vs 注入

启用(联接) 注入(会话选择)
载体 ~/.dsh/skills/<slug> 目录联接 会话技能表 ~/.dsh/S-M-C/contexts.json 里每个对话一行
作用范围 全局:所有对话、所有工作区、含子智能体 仅本对话
谁维护 技能页的「启用 / 不启用」 「会话默认」开关、小窗、以及模型自己的 skill_select
谁看得见 dsh 原生文件系统扫描 本插件的会话注入

会话选择的存储方式:文件里存的是与默认的差异(overrides: { on, off }),有效集合 = 默认 ∪ on \ off。这样改了默认,未单独配置过的对话立刻跟着变;而你在某个对话里手动关掉的技能不会被默认拉回来。

🤖 交给 agent 的两个工具

工具 作用
skill_select 为本对话启用 / 停用某个技能;写入该对话自己的差异并立即生效。接受所有已联接的条目——容器目录同样可以(其 DESCRIPTION.md 即可加载的正文)。
skill_query 只读查询本工作区可见的技能清单(名称 / 描述 / 分组 / 是否已联接 / 本对话是否已注入),调用时动态计算,可关键词与分组过滤。

技能目录也由本插件生成(影子目录):目录里会多出一行 smc-skill-index —— 索引技能,加载它即可拿到本工作区的完整技能列表(格式与目录层一致);未注入的技能不能加载(提示 "not enabled in this conversation");/技能名 手势不受影响。

此外,「使用说明」页可开启向 AI 公告:把插件能力与三类工具的现状写进每个 agent 的系统提示——

向 AI 公告

向 AI 公告:展开后声明插件能力;设置持久化在 dsh-s-m-c-center 命名空间,切换即时生效。

🧱 架构

挂载与双面结构 —— 插件只是一个 npm 包 + 一行 profile bundle patch,dsh 源码零改动:

挂载与双面架构

Host 半区注册路由、公告 agent、真连 MCP;Client 半区只提供设置页,两者通过 /api/dsh-s-m-c-center/* 通信。

储存库布局 —— 插件的数据全部收在 ~/.dsh/S-M-C,而 dsh 扫描的两个目录刻意留在库外(插件只往里面注入 / 移除联接):

统一外挂储存库布局

技能的「正本」始终在储存库里;~/.dsh/skills 下那个条目只是指向正本的联接。

三个开关在磁盘上的真实动作 —— 不是改配置字段,是真的动文件 / 动连接:

三个开关的真实动作

技能 = 增删联接;MCP 激活 / 归档 = 定义在 mcp.json 与 mcp-archive.json 之间搬家;CLI = 只切可见性。

🚀 安装

环境要求:DeepSeek Harness >= 0.1.2-alpha.2(@deepseek-ai/* 统一发版);Node ^22.19.0 || >=24。 现状:0.2.1-alpha.1(端到端实测:全部插件路由、两个半边与设置页)以及 0.2.0-rc.1、0.1.7-rc.2(均含全部插件路由、会话注入链路与界面)还有 0.1.6-alpha.1、0.1.6-alpha.2、0.1.5-rc.2 上完整实测;0.1.2-alpha.2 起所用 API 已逐一核对存在且签名一致。 也支持桌面版——插件只走 dsh 的 Host / Client 插件接口,不依赖 CLI 形态,桌面版已实测可用。

必须按普通包安装 —— 切勿 junction 链接。 junction 会让依赖(schemastery / react 等)无法向上解析,并导致包名与 cordis.patch.yml 不一致;两者都会让 DSH 启动失败。

# 从 npm 安装
dsh plugin --profile web add dsh-s-m-c-center
# 或:npm install dsh-s-m-c-center

# 从源码(本仓库 / 克隆后)
dsh plugin --profile web add <本文件夹绝对路径>

# 或安装打包产物
dsh plugin --profile web add <path>/dsh-s-m-c-center-0.2.4.tgz

# 或使用一键脚本
bash scripts/install.sh                                        # macOS / Linux / Git Bash
powershell -ExecutionPolicy Bypass -File scripts/install.ps1   # Windows

首次安装后需要重启 DSH 并硬刷新浏览器(Cmd/Ctrl+Shift+R),然后进入「设置 → Web UI 插件 → 工具管理」。

升级:只改界面时,覆盖文件 + 硬刷新即可;改到 Host 侧(路由 / 引擎 / 工具)时需要重启一次 DSH 进程。

🔧 配置

插件配置完全自管,存放在储存库内的 ~/.dsh/S-M-C/settings.json —— 不写入 dsh 的 settings.yaml(dsh 0.1.7 起会在升级时把该文件归档为 settings.yaml.imported,里面的第三方配置块会全部丢失):

{
  "enabled": true,        // 总开关(路由、MCP 连接、CLI 探测)
  "announceToAgent": true // 向每个 agent 的系统提示说明本插件
}

运行时状态:

  • 插件设置:S-M-C/settings.json,随储存库走;从旧版本升级时首次启动会把 settings.yaml(或其归档)里的旧配置块一次性迁入。
  • 统一外挂储存库:~/.dsh/S-M-C/(Skills / MCP / CLI)—— skills/(正本与 index.json 清单)、skills-links.json(联接账本)、skills-registry.json(登记的外部技能与溯源标记 missing)、mcp.json、mcp-archive.json、cli.json。旧位置在首次启动时自动迁入;整个库可用 DSH_STORE_ROOT 挪到别处(插件会重建目录联接)。
  • 会话选择:全机一张表 —— ~/.dsh/S-M-C/contexts.json,default 是会话默认,sessions.<sessionId> 是该对话与默认的差异(on / off)。不涉及工作区:键就是会话 id,所以设置页与小窗读的是同一份文档。旧版每个工作区一份文件,首次挂载(表不存在时)会一次性并入。
  • MCP:激活的 S-M-C/mcp.json,归档的 S-M-C/mcp-archive.json(凭证 / headers 明文保存 —— 请保持这两个文件 0600)。
  • CLI 注册表:S-M-C/cli.json。

🔒 权限与依赖声明

插件以 DSH 进程权限运行,会用到文件、网络、命令与凭据四类能力 —— 逐项说明用途与边界:

能力 做什么 范围与边界
文件 读写储存库 ~/.dsh/S-M-C/**;在技能根目录创建 / 移除目录联接;读写会话技能表 ~/.dsh/S-M-C/contexts.json(以及旧布局的 <workspace>/.dsh/S-M-C/contexts/*.json,仅由导入读取一次);读取 SKILL.md 与 skill 内嵌脚本 只动储存库与 dsh 扫描的四个技能根目录;就地技能只改写前言标记;不读写其它路径
网络 连接用户自己配置的 MCP 服务器(stdio 走子进程,streamable-http 走 HTTP) 只连用户在管理页填写的服务器地址;插件自身无内置外部服务、无遥测、不上报任何数据
命令 探测本地 CLI 工具:执行其 --help / --version 或 cli-state 声明的探测命令 只执行注册表内、管理页可见的命令;不执行用户未登记的其它命令
凭据 保存 MCP 的 env / headers / API-Key,读取 CLI 的 cli-state 只在本机 ~/.dsh/S-M-C/*.json 明文读写、不外发;建议将这两个文件权限设为 0600

外部依赖:运行时依赖仅 schemastery(设置项校验);@deepseek-ai/* 与 react 是 peer 依赖,由 DSH 提供;无原生模块,无 postinstall / prepare 等生命周期脚本。

失败边界:目录扫描或路由失败降级为空列表与占位提示;迁移失败只记入 failures 并继续,不阻塞 DSH 启动;MCP 连接失败只改变状态显示、不动文件;会话注入失败不会否决会话创建,只在日志里说明原因。任何一项都不会让 DSH 启动失败。

已知风险:

风险 说明
删除不可恢复 物理删除,且只删储存库正本:native 技能需先「迁移入库」,registered 用「取消登记」,「删除联接」只解联、从不删目标
MCP 凭证明文 密码 / env 明文保存在 mcp.json,文件权限由用户自己保证
手动搬储存库会断联接 启用 / 禁用经目录联接生效;要搬迁请用 DSH_STORE_ROOT,插件会自建联接
分类目录里的技能加载不了 dsh 只扫根目录一层;插件会把那个目录标成「非法技能」并说明原因,但不会把子技能列出来(列出来也够不着)。要用它们需要把技能移到根目录一层或收进储存库
📦 展开查看仓库结构
dsh-s-m-c-center/
├── src/
│   ├── index.ts            # 宿主组合根(挂载、设置、公告、工具注册)
│   ├── routes.ts           # 路由汇总(按域拼装)
│   ├── setup.ts            # 身份常量 + 面向 agent 的说明文案
│   ├── shared/             # 跨域原语:paths / fs-utils / frontmatter / http / protocol
│   ├── features/           # 垂直切片,每域自持 manager + routes + index 桶
│   │   ├── skills/         #   技能:roots / scanner / linking / links / registry /
│   │   │                   #        adopt / delete / migration / store-index / catalog
│   │   ├── mcp/            #   MCP:document / manager / routes
│   │   ├── cli/            #   CLI:probe / registry / manager / routes
│   │   ├── context/        #   会话注入:engine / apply / tools / routes
│   │   ├── announce/       #   系统提示公告
│   │   └── settings/       #   插件设置命名空间
│   └── client/             # 浏览器半区
│       ├── shell/          #   设置卡片外壳、侧边栏「会话技能」小窗
│       ├── shared/         #   api / ui / locales(zh+en) / format / css module
│       └── features/       #   四个页签各自的面板 + hook
├── lib/                    # 构建产物(宿主 index.js;客户端 client.js;types/*)
├── tests/                  # vitest(15 个文件)
├── cordis.patch.yml        # DSH bundle patch(包名必须与 package.json 一致)
├── dsh.plugin.json         # DSH 插件清单(id / version / main / client.main)
├── package.json            # npm 包(dsh.bundle.patch + dsh.client + compatibility)
├── LICENSE                 # MIT
├── README.md / README.zh.md
├── docs/
│   ├── 功能介绍.md / 架构.md / development.md
│   ├── arch-*.svg          # 架构图(本文档引用)
│   ├── social-preview.png  # 仓库社交预览图
│   └── shots/              # 界面截图(本文档引用)
└── scripts/install.*       # 一键安装进 DSH profile

🧰 开发

见 docs/development.md:双半区构建(tsdown 重建 lib/index.js + lib/client.js)、类型检查(tsc --noEmit)与测试套件(vitest,16 个文件 / 237 个用例)。

📄 许可

MIT。


English: README.md.