npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-s-m-c-center

v0.2.8

Published

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;

Readme

[!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 服务 | 真实连接,激活 / 归档一键切换 | | | | | CLI 工具 | 发现 / 探测 / 登记本地 CLI | 使用说明 | 三类工具讲解 + 卸载撤退口 | | | |

💡 功能亮点

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

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

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

    | 状况 | 显示 | 为什么不往下钻 | |---|---|---| | 目录里没有准入文档 | 标红 非法技能 | dsh 只认技能根目录一层,埋在 <根>/<分类>/<技能>/ 里的技能对它本来就不存在;列出来只会让人以为够得着 | | 登记记录的正本没了 | 标 ⚠ 正本已失效 | 见下条 |

  • 溯源可查的登记表:「溯源刷新」分两步,因为"这条记录没用了"和"它指向的正本坏了"要做的事完全不同。

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

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

  • 会话默认与按对话注入:会话默认 是新对话的起始技能;每个对话还能有自己的差异(关掉某个、追加某个)。对话里的 agent 可以自己开关(写入该对话自己的配置),侧边栏「新会话」正下方还有一个「会话技能」小窗供你随时手动调整——两处列表都只列已联接的技能。小窗每秒静默自查一次,只有内容真变了才重绘:切换对话、给对话改名都会在 1 秒内自己跟上,所以它不再需要「刷新」按钮;点窗口外面即关闭,要它常驻就点图钉钉住(钉住只决定「点外面关不关」,不影响拖动与缩放)。详见下一节。

  • 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 双语(各 220 键,英文环境零中文);破坏性操作两步确认,且点开别处即复位。

🧠 两条通道:联接 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 的系统提示——

🧱 架构

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

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

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

🚀 安装

环境要求: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.8.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,20 个文件 / 287 个用例)。

📄 许可

MIT。


English: README.md.