reactive-resume
reactive-resume
A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:Fishquito7/dsh-skill-mcp-panel
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
DSH 插件:把技能与 MCP 服务器的管理搬进 DSH Web 的主页侧边栏——点左栏的「技能」/「MCP」,中央主区直接切到整页面板(不是弹窗,也不是设置页里的 tab),改完即生效。随包附带统一终端命令 dsh-panel:面板能做的事命令行都能做,另外多一个跨 profile 升级。
.md / .zip / 技能文件夹的添加与批量迁移cordis.patch.yml 中的 MCP 受管块,Stdio / HTTP 两种调用方式,支持测试连接,保存后由 DSH HMR 热加载dsh-panel 命令行 —— dsh-panel skill … 与 dsh-panel mcp … 覆盖两个面板的全部能力profile 提示:
mcp子命令必须显式写--profile <name>,且名字必须已存在——打错会被拒绝,不会新建 profile。skill不按 profile 分家(技能按用户根 / 工作区存放),不需要该参数。不带--profile的dsh-panel update升级全部已安装本插件的 profile(desktop由桌面应用独占,自动跳过)。
目录:界面预览 · 安装 · 功能 · 命令行 · 工作原理 · 开发 · 卸载 · 更新日志 · 链接 · License
面板入口在主页左侧栏「插件」下方(v2.1.0 起由设置页迁移到侧边栏),点「技能」/「MCP」即在中央主区打开;两个页面左上角都有「← 返回会话」,可直接回到进面板前那个会话。
入口 · 主页侧边栏中的「Skill/MCP」(v2.1.5 起两个面板合并为一行,标签固定用英文写法)
技能面板 · 搜索 / 全部启停 / 显示插件技能开关 / 卡片展开查看全文
技能分组 · 新建 / 重命名 / 批量勾选成员
批量迁移 · 源工作区 / 多选目标 / 复制或移动
MCP 面板 · 注册机制说明 / 服务器卡片 / 工具数 / 启停 / 测试连接
添加 MCP 服务器 · STDIO / HTTP 两种调用方式
安装本包,二选一(桌面端用户请在内置插件安装器中输入'...add'后面的内容):
方式一:GitHub Release tarball(推荐,恒定指向最新版)
dsh plugin --profile web add https://github.com/Fishquito7/dsh-skill-mcp-panel/releases/latest/download/dsh-skill-mcp-panel.tgz
这是无版本号的稳定链接:每次发版都同时上传别名 dsh-skill-mcp-panel.tgz(恒定指向最新版)与带版本号的
dsh-skill-mcp-panel-<版本>.tgz,所以这条命令不随版本改。需要锁定具体版本时,把 latest/download/dsh-skill-mcp-panel.tgz
换成 download/v<版本>/dsh-skill-mcp-panel-<版本>.tgz 即可。
方式二:npm(预构建,插件市场同款通道)
dsh plugin --profile web add dsh-skill-mcp-panel
两种方式都安装预构建产物,无需本地构建。也可以从 Git 安装(Git 来源的依赖默认禁止运行 prepare 构建脚本;若报
git-hosted plugins build on install...,把 pnpm 在上面打印的 key 加到 profile 目录pnpm-workspace.yaml的allowBuilds下再重跑):dsh plugin --profile web add github:Fishquito7/dsh-skill-mcp-panel
重启网关
重启后刷新页面:左侧栏「插件」下面就是合并后的「Skill/MCP」一行——点它把中央主区切成面板,面板内部再用页签切换「技能」与「MCP」。
面板与宿主自带的「插件」页一样,是侧边栏全局面板:左栏只有一行「Skill/MCP」(v2.1.5 起两个面板合并,侧栏那一格还给会话),点它直接把中央主区切过去(不是设置页那种弹窗),页签在面板内部切换,并记住你上次离开时停在哪一页。左上角有「← 返回会话」箭头,点它立刻回到进面板之前那个会话;点会话列表里的任意会话或「插件」也能切走。
.md / .zip),或把文件、压缩包、技能文件夹直接拖进页面——自动识别目录束 / 单文件 / 压缩包结构,不合规内容会被拒绝并提示原因~/.dsh/skills,限定工作区在该工作区的 .dsh/skills。页面「技能列表」下方有一条工作区选择器(折叠式下拉,全局 + 各工作区,最多显示 11 项、其余滚动),选中即只显示该工作区下的技能。~/.dsh/skills/.system/skill-viewer/groups.json),不修改技能目录。--global / --project / --workspace 显式指定。cordis.patch.yml 中的 MCP 服务器受管块;env / headers 密钥在 RPC 与页面中脱敏,编辑时缺省 key 保留旧值;${NAME} 就是读环境变量,面板 / CLI 保存时自动格式化成 cordis.patch.yml 里的 !!js 表达式(DSH 配置层唯一的插值机制,宿主装载时求值)。例如请求头填 Bearer ${MCP_TOKEN},落盘就是 Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`',读回来仍显示 Bearer ${MCP_TOKEN};!!js 前缀保留为进阶写法(原样透传任意 JS 表达式),手写的 !!js 也不会再被写坏成字面量!!js 的关系cordis.patch.yml 面板块外的用户内容逐字节保留。sidebar.panellist 列表槽位 + main 键控槽位),点击左栏「技能」/「MCP」直接在中央主区切页,设置页不再有这两个 tab;面板自带整页外壳(滚动与页边距)。需要宿主提供上述两个槽位,本机 DSH 0.1.6-alpha.2 已实测。ctx.layout.selectPanel(null),不改变当前会话)。dsh-skill-mcp-panel:last-tab),下次点开侧栏这一行就停在上次离开的那一页。本插件对宿主有三处版本敏感的依赖,彼此无关,同一份构建同时满足全部三条:
| 宿主版本 | ① 插件树加载(TypertCodec) | ② 技能页图标(primitives 导出名) | ③ 侧栏面板槽位 |
|---|---|---|---|
0.1.5-rc.x |
✅ 读 schema |
✅ 旧名 | ⚠️ 未验证 |
0.1.6-alpha.1 |
✅ 读 schema |
✅ 旧名 | ⚠️ 未验证 |
0.1.6-alpha.2 ~ 0.1.7-alpha.0 |
✅ 读 create |
✅ 旧名 | ✅ |
0.1.7-alpha.1 ~ 0.1.8 |
✅ 读 create |
✅ 新名 | ✅ |
0.2.0-rc.x |
✅ 读 create |
✅ 新名 | ✅ |
① TypertCodec create() 契约:自 0.1.6-alpha.2 起 strict codec 改为持 schema 工厂 create();仍写 schema: 的插件在注册阶段直接抛错,整个插件树加载失败、网关起不来(Issue #20)。本插件的每个 codec 同时携带 schema 与 create,两代宿主都只做 typeof 检查、都不拒绝多余属性,因此一份构建通吃,无需版本探测。守卫:test-codec.mjs。
② 技能页图标导出名:0.1.7-alpha.1 把图标的像素后缀换成描边档位(IconSkillOutline16 → IconSkillOutlineRegular,尺寸改由 size prop 传),两代命名没有交集。技能半区 6 处引用改走 primitiveIcon(cur, legacy)「新名优先、旧名回退」;若直接换成新名,0.1.6 及更早的用户会反向打不开。守卫:test-host-icons.mjs。
③ 侧栏面板槽位:v2.1.0 起面板挂在宿主 sidebar.panellist(list 槽位)+ main(键控槽位)上,需要宿主提供这两个槽位。0.1.6-alpha.2 实测通过,0.1.7 系列槽位名未变。0.1.5-rc.x / 0.1.6-alpha.1 未验证;即使槽位缺失,插件树与 CLI 仍然可用,只是左栏不会出现「技能」「MCP」两行。
④ peerDependencies 硬闸门(v2.1.2):本包声明 "@deepseek-ai/dsh": ">=0.1.5-rc.0 <0.3.0-0"。DSH 的 evaluatePluginCompatibility 会在安装时与profile 启动时校验它,不满足就拒绝加载并打印精确豁免命令——把「静默崩」换成「明着拦」。没有这个字段时该校验直接放行,这正是 0.1.7-rc.1 那次断裂能静默发生的原因。
上界写成 <0.3.0-0 而不是 <0.3.0:该校验带 includePrerelease,<0.3.0 会把 0.3.0-rc.1 也放进来。
v2.1.3 把上界从 <0.2.0-0 抬到 <0.3.0-0:桌面端自动升级到 0.2.0-rc.2 后,旧区间会被判成不兼容,宿主在 profile 启动时直接禁用整行(dsh: disabling profile plugin row "skill-mcp-panel": ...),面板从侧栏整体消失。0.2.0 的 ①②③ 三处契约均未变(图标导出名、sidebar.panellist+main 槽位、TypertCodec 仍读 create()),且已用 0.2.0 自带的 evaluatePluginCompatibility 与 registry 校验器实测通过。
下限 0.1.5-rc.0 是「插件树还能加载」的边界,比上表「面板已实测」的范围更宽——区间内不等于面板已验证。
在区间外的宿主上确需使用时,用宿主自己的精确版本豁免:
dsh plugin --profile web allow-version dsh-skill-mcp-panel@2.1.5 --dsh-version <宿主版本> --accept-risk
守卫:test-cli-profiles.mjs(直接调用宿主真实的 evaluatePluginCompatibility 验证区间两端)。
统一父命令为 dsh-panel。
全局 shim:宿主启动时会在 npm 全局 bin 目录写入
dsh-panel。Windows 下写三份——dsh-panel.cmd(CMD)、dsh-panel.ps1(PowerShell)、以及无扩展名的dsh-panelsh 脚本(Git Bash / MSYS2 / Cygwin 靠它,v2.1.5 之前缺这一份,bash 里会报command not found);macOS / Linux 写一份可执行的dsh-panel。三份都指向「最后启动的那个 profile」装的插件副本。
mcp 子命令必须用 --profile <name> 指定目标 profile,名字必须已存在(判据是
$DSH_HOME/profiles/<name>/package.json)。打错名字会以退出码 2 被拒绝,不会像 dsh plugin
那样顺手新建一个 profile。skill 子命令不需要 --profile——技能按用户根 / 工作区存放,不按
profile 分家。dsh-panel update 不带 --profile 时升级全部已安装本插件的 profile。
dsh-panel profiles # 每个 profile 的已装版本 / bundles 挂载情况 / 安装 spec
输出的第一行是当前 dsh-panel 入口的路径与版本。这条信息是必要的:dsh-panel 是全局单例 shim,
由最后启动的那个 profile 写入(src/global-shim.ts),因此它与表中任何一行都没有必然关系。
dsh-panel skill --help
dsh-panel skill list # 列出技能(含工作区:全局 / 工作区)
dsh-panel skill add <path> # 添加到全局(.md 文件、目录束或 .zip 压缩包)
dsh-panel skill add <path> --workspace D:\项目A # 直接添加到指定工作区
dsh-panel skill scope <name> --global # 迁移单个技能到全局
dsh-panel skill scope <name> --workspace D:\项目A # 迁移到指定工作区(--copy 复制)
dsh-panel skill migrate <name...|--all> --from <全局|路径> --to <全局|路径> [--copy] [--yes]
dsh-panel skill disable <name> # 停用
dsh-panel skill enable <name> # 启用
dsh-panel skill delete <name> # 删除(需确认)
技能文件全局共享(~/.dsh/skills 与 <工作区>/.dsh/skills),不按 profile 分家,所以
skill 子命令不需要 --profile。可选地加上它,会顺便确认该 profile 存在,并在它没把本插件
挂进 dsh.profile.bundles 时提醒你「这个 profile 看不到面板」。
dsh-panel mcp list --profile web
dsh-panel mcp add --name <serverName> --stdio --command <cmd> [--args <arg> ...] [--env KEY=VALUE ...] [--cwd <path>] --profile web
dsh-panel mcp add --name <serverName> --http --url <url> [--header KEY=VALUE ...] --profile web
dsh-panel mcp enable|disable <serverName> --profile web
dsh-panel mcp remove <serverName> [--yes] --profile web
dsh-panel mcp test <serverName> --profile web
环境变量取值直接写 ${NAME}(保存时格式化成 cordis.patch.yml 的 !!js 表达式,由 DSH 装载时求值);以 !!js 开头的值按进阶写法原样透传:
dsh-panel mcp add --name github --stdio --command npx --args -y --args @modelcontextprotocol/server-github \
--env 'GITHUB_TOKEN=${GITHUB_TOKEN}' --profile web
dsh-panel mcp add --name web --http --url https://example.com/mcp \
--header 'Authorization=Bearer ${MCP_TOKEN}' --profile web
# 进阶:整段 JS 表达式原样写进 !!js 标签
dsh-panel mcp add --name web2 --http --url https://example.com/mcp \
--header 'Authorization=!!js `Bearer ${process.env.MCP_TOKEN}`' --profile web
dsh-panel mcp add --name github --stdio --command npx --args -y --args @modelcontextprotocol/server-github \
--env 'GITHUB_TOKEN=!!js process.env.GITHUB_TOKEN' --profile web
dsh-panel mcp add --name web --http --url https://example.com/mcp \
--header 'Authorization=!!js `Bearer ${process.env.MCP_TOKEN}`' --profile web
MCP 配置写入目标 profile 的 cordis.patch.yml 受管块;网关在线时自动热加载。面板块由
# >>> dsh-skill-mcp-panel:mcp:begin / # <<< ...end 标记,请勿手改块内内容。
dsh-panel update # 升级全部已安装本插件的 profile
dsh-panel update --yes # 同上,不询问
dsh-panel update --profile web # 只更新 web
dsh-panel mcp update # 等价于 dsh-panel update
node_modules 里已装的版本,不是正在执行的那份 CLI 的版本。github:Fishquito7/dsh-skill-mcp-panel#v<版本>。desktop 由 DSH 桌面应用独占,宿主的 dsh plugin --profile desktop 会直接报错;自动枚举时跳过并说明,
显式 --profile desktop 时以退出码 2 报错。CLI 只扫描当前目录锚定的项目根与用户根;管理其他工作区的技能请加 --cwd <工作区路径>。
同名技能存在于多个作用域时,enable/disable/delete 需加 --global/--project/--workspace 指定操作哪一份。
页面和 dsh-panel skill 命令的每次操作,最终都是对磁盘上技能文件(SKILL.md)的改动,DSH 自带的文件监听器立刻发现变化——所以启用/停用、增删、迁移都热生效,无需重启网关。
~/.dsh/skills,工作区 = <工作区>/.dsh/skills,没有隐藏存储或联接点——卸载插件后技能仍是普通文件,照常被 DSH 发现SKILL.md 改名为 SKILL.md.disabled,启用 = 改回来负责把 MCP 服务器配置写进 profile 的 cordis.patch.yml 受管块;真正连接和注册工具的是 DSH 官方插件 @deepseek-ai/dsh-mcp-client,由 DSH 的 HMR 自动加载。
源码为 TypeScript,位于 src/;编译产物 lib/*.js 随仓库一起提交(保证 Git 直装可用)。
改完源码后运行 pnpm build:tsc 编译到 lib/ 并剥离浏览器束的多余模块标记。
发布时 npm pack 会通过 prepack 自动重新构建,无需手工编译。
dsh plugin --profile web remove dsh-skill-mcp-panel
只列会改变使用方式的版本要点;完整改动见 Releases。
${NAME} 直觉写法(面板/CLI 自动格式化成 !!js,读回来仍是 ${NAME},不再被写坏成字面量)、MCP 页新增「注册机制」说明按钮,并为空字段补灰字示例;Windows 补上无扩展名的 bash shim;dsh-panel update 保持各 profile 原本的安装渠道(tarball / npm / Git),README 安装指引改用无版本号的稳定 tarball 链接0.2.0(peer 上界抬到 <0.3.0-0,否则宿主会在 profile 启动时禁用整行);MCP 表单里非法的服务器名不再只报一句网关「天书」mcp 子命令必须显式 --profile,错名一律拒绝且不会新建 profile;dsh-panel update 不带 --profile 时升级全部 profile;新增 dsh-panel profiles0.1.7 重命名的图标导出,技能页不再一片空白MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: skills、mcp。