🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

插件合集面板 pengxiaozi/dsh-plugins

DeepSeek Harness
pengxiaozi5 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 社区插件:MCP 连接管理面板 + Skills 管理面板ZIP 导出

34.3/100
综合分
6
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add pengxiaozi/dsh-plugins
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/20) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 73 处,展示前 64 条)
  • 发起网络请求
    dsh-mcp-panel/client/client.js:82
    const response = await fetch(url, Object.assign({ credentials: 'same-origin', headers: { accept: 'application/json' } }, options || {}))
  • 写入本地文件
    dsh-mcp-panel/lib/index.js:177
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    dsh-mcp-panel/lib/index.js:178
    writeFileSync(file, new Date().toISOString() + ' ' + message + '\n', { flag: 'a' })
  • 读取本地文件
    dsh-mcp-panel/lib/index.js:186
    return JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    dsh-mcp-panel/lib/index.js:194
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    dsh-mcp-panel/lib/index.js:195
    writeFileSync(tmp, text)
  • 写入本地文件
    dsh-mcp-panel/lib/index.js:196
    renameSync(tmp, file)
  • 读取本地文件
    dsh-mcp-panel/lib/index.js:364
    current = readFileSync(patchPath, 'utf8')
  • 发起网络请求
    dsh-runtime-inspector/client/client.js:499
    fetch(`${API}${path}`, {
  • 写入剪贴板
    dsh-runtime-inspector/client/client.js:558
    clipboard.writeText(text).then(() => {
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:93
    const entries = await readdir(join(dir, SCOPE))
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:114
    const source = await readFile(file, 'utf8')
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:144
    const text = await readFile(file, 'utf8')
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:451
    const entries = await readdir(join(root.dir, SCOPE), { withFileTypes: true })
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:476
    const manifest = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8'))
  • 读取本地文件
    dsh-runtime-inspector/lib/inventory.js:482
    const source = await readFile(join(dir, 'lib', 'index.js'), 'utf8')
  • 发起网络请求
    dsh-sec-checklist/client/client.js:39
    const res = await fetch(url, options)
  • 写入剪贴板
    dsh-sec-checklist/client/client.js:268
    await navigator.clipboard.writeText(String(value))
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:96
    try { names = readdirSync(root.path) } catch { continue }
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:102
    try { stat = statSync(abs) } catch { continue }
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:106
    if (existsSync(candidate)) mdPath = candidate
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:114
    try { text = readFileSync(mdPath, 'utf8').slice(0, 65536) } catch { continue }
  • 写入本地文件
    dsh-sec-checklist/lib/index.js:389
    writeFileSync(logPath, '[' + new Date().toISOString() + '] ' + String(message) + '\n', { flag: 'a' })
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:395
    if (!existsSync(configPath)) {
  • 写入本地文件
    dsh-sec-checklist/lib/index.js:396
    try { writeFileSync(configPath, JSON.stringify(defaultConfig(), null, 2) + '\n') } catch (error) { log('config init failed: ' + error) }
  • 读取本地文件
    dsh-sec-checklist/lib/index.js:402
    const stat = statSync(configPath)
  • 写入本地文件
    dsh-sec-checklist/lib/index.js:426
    writeFileSync(tmp, JSON.stringify(config, null, 2) + '\n')
  • 写入本地文件
    dsh-sec-checklist/lib/index.js:427
    renameSync(tmp, configPath)
  • 发起网络请求
    dsh-sensitive-mask/client/client.js:83
    const response = await fetch(url, Object.assign({ credentials: 'same-origin', headers: { accept: 'application/json' } }, options || {}))
  • 执行外部命令来自配置/变量
    dsh-sensitive-mask/lib/index.js:367
    const child = spawn(command, [dir], { detached: true, stdio: 'ignore' })
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:384
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:404
    appendFileSync(file, lines.join('\n') + '\n')
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:412
    names = readdirSync(dir)
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:420
    const st = statSync(full)
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:433
    if (!existsSync(full)) throw new Error('日志文件不存在')
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:434
    const lines = readFileSync(full, 'utf8').split('\n').filter(Boolean)
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:486
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:487
    writeFileSync(tmp, text)
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:488
    renameSync(tmp, file)
  • 写入本地文件
    dsh-sensitive-mask/lib/index.js:518
    mkdirSync(logDir, { recursive: true })
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:519
    if (!existsSync(configPath)) writeFileAtomic(configPath, JSON.stringify(defaultConfig(), null, 2) + '\n')
  • 读取本地文件
    dsh-sensitive-mask/lib/index.js:524
    const st = statSync(configPath)
  • 发起网络请求
    dsh-session-exporter/client/client.js:216
    fetch(`${API}${path}`, { cache: 'no-store', credentials: 'same-origin', headers: { accept: 'application/json' } })
  • 发起网络请求
    dsh-session-exporter/client/client.js:274
    const response = await fetch(`${API}/save`, {
  • 读取本地文件
    dsh-session-exporter/lib/sessions.js:273
    const info = await stat(workspacePath).catch(() => null)
  • 读取本地文件
    dsh-session-exporter/lib/sessions.js:281
    while (existsSync(directory)) {
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:285
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:299
    await writeFile(target, result.content, 'utf8')
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:317
    await writeFile(join(directory, 'all.json'), JSON.stringify({ exportedAt: new Date().toISOString(), sessions: combined.json }, null, 2), 'utf8')
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:321
    await writeFile(join(directory, 'all.md'), `# 工作区全部会话导出\n\n- 工作区:\`${workspacePath}\`\n- 会话数:${sessions.length}\n- 导出时间:${new Date().toISOString()}\n$
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:325
    await writeFile(join(directory, 'all.qa.json'), JSON.stringify({ exportedAt: new Date().toISOString(), sessions: combined.qa }, null, 2), 'utf8')
  • 写入本地文件
    dsh-session-exporter/lib/sessions.js:338
    await writeFile(join(directory, 'manifest.json'), JSON.stringify(manifest, null, 2), 'utf8')
  • 发起网络请求
    dsh-skill-panel/client/client.js:91
    const response = await fetch(url, Object.assign({ credentials: 'same-origin', headers: { accept: 'application/json' } }, options || {}))
  • 发起网络请求
    dsh-skill-panel/client/client.js:103
    const response = await fetch(url, { credentials: 'same-origin' })
  • 写入剪贴板
    dsh-skill-panel/client/client.js:269
    await navigator.clipboard.writeText(skill.dir || skill.path || '')
  • 执行外部命令来自配置/变量
    dsh-skill-panel/lib/index.js:52
    const child = spawn(command, [dir], { detached: true, stdio: 'ignore' })
  • 读取本地文件
    dsh-skill-panel/lib/index.js:165
    names = readdirSync(dir)
  • 读取本地文件
    dsh-skill-panel/lib/index.js:175
    st = statSync(abs)
  • 读取本地文件
    dsh-skill-panel/lib/index.js:198
    if (typeof skillPath !== 'string' || skillPath === '' || !existsSync(skillPath)) return null
  • 读取本地文件
    dsh-skill-panel/lib/index.js:201
    st = statSync(skillPath)
  • 读取本地文件
    dsh-skill-panel/lib/index.js:298
    names = readdirSync(root.path)
  • 读取本地文件
    dsh-skill-panel/lib/index.js:308
    st = statSync(abs)
  • 写入本地文件
    dsh-skill-panel/lib/index.js:368
    mkdirSync(profileDir, { recursive: true })
  • 写入本地文件
    dsh-skill-panel/lib/index.js:369
    appendFileSync(join(profileDir, 'skill-panel.log'), new Date().toISOString() + ' ' + message + '\n')
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
DSH Plugins — DeepSeek Harness 社区插件 面向 DeepSeek Harness 的六个 Web 插件:MCP 连接管理、Skills 管理、敏感信息脱敏、渗透测试安全清单、运行时透视(拦截 / 规则 / 提示词链)和 会话导出。运行时透视与会话导出是左侧栏独立面板,其余搬进设置页;全部纯本地运行,无任何外部上传。 插件一览 | 插件 | 设置入口 | 能力 | | dsh-mcp-panel | MCP 连接 | 查看所有 MCP 服务器(托管 + profile 配置行)、连接状态与工具数;新增/编辑/删除;托管配置写入 profile 的 cordis.patch.yml 并热重载 | | dsh-skill-panel | Skills | 查看全部本地/内置 skill,搜索、来源过滤、SKILL.md 预览、文件清单、打开文件夹;导出单个/选中/全部为 ZIP(含 _manifest.json) | | dsh-sensitive-mask | 脱敏显示 | 发往模型前按正则/字面量脱敏(占位符 / 部分隐藏 / 固定文本,全局默认 + 单规则覆盖,头尾位数可配);仅占位符会在工具执行前还原;命中写本地 JSONL 日志(默认不存原文) |
展开完整文档(README 剩余 1 节)
DSH Plugins — DeepSeek Harness 社区插件

面向 DeepSeek Harness 的六个 Web 插件:MCP 连接管理、Skills 管理、敏感信息脱敏、渗透测试安全清单、运行时透视(拦截 / 规则 / 提示词链)和 会话导出。运行时透视与会话导出是左侧栏独立面板,其余搬进设置页;全部纯本地运行,无任何外部上传。

插件一览

| 插件 | 设置入口 | 能力 |
| dsh-mcp-panel | MCP 连接 | 查看所有 MCP 服务器(托管 + profile 配置行)、连接状态与工具数;新增/编辑/删除;托管配置写入 profile 的 cordis.patch.yml 并热重载 |
| dsh-skill-panel | Skills | 查看全部本地/内置 skill,搜索、来源过滤、SKILL.md 预览、文件清单、打开文件夹;导出单个/选中/全部为 ZIP(含 _manifest.json) |
| dsh-sensitive-mask | 脱敏显示 | 发往模型前按正则/字面量脱敏(占位符 / 部分隐藏 / 固定文本,全局默认 + 单规则覆盖,头尾位数可配);仅占位符会在工具执行前还原;命中写本地 JSONL 日志(默认不存原文) |
| dsh-sec-checklist | 安全清单 | 渗透测试检查清单:内置 6 分类 36 项 + 自定义;项目/授权/范围/测试账号本机保存;勾选要调用的渗透 skill;保存后注册运行时技能 security-checklist 供 AI 加载;内置 Playbook 与 Yakit MCP 工具对照 |
| dsh-runtime-inspector | 左侧栏「运行时透视」 | 查看宿主真正拦截了什么:事件钩子表(监听器按 Loader 包归属、注册顺序、prepend)、运行时拦截决策记录(pass / intercept / error)、审批与 workspace 规则、system prompt 装配链与渲染结果、宿主包字符串常量与 schema 默认值。只读、同源登录鉴权、无外部请求 |
| dsh-session-exporter | 左侧栏「会话导出」 | 按工作区列出全部会话(含冷会话/子会话),单会话或整批导出 Markdown / 无损 JSON / JSONL / 问答 JSON / 事件索引;下载 ZIP 或写入 <workspace>/dsh-session-exports/<时间戳>/(含 all.md / all.json / all.qa.json / manifest.json);Agent 可用 dsh_session_export 读取导出内容并提炼成 Markdown 文档。只读会话日志,唯一写操作限于已注册工作区 |

六个插件都是 host 半 + web client 半 的结构,遵循 DSH 官方插件形态:

- package.json 声明 dsh.bundle.patch 与 dsh.client;
- host 半通过 ctx.inject(['webServer']) 挂同源 HTTP 路由;
- client 半注册 settings.section 面板,通过 window.__ModuleLoader__ 懒加载。

Skills

| Skill | 作用 |
| plan-gate | 首个需求先出「实施方案 + 涉及文件清单」再请求确认的闸门;确认后执行,同一需求只做一次 |

安装(全局技能目录):把 skills/plan-gate 复制到 <AGENTS_HOME>/skills/plan-gate(Windows 默认 %USERPROFILE%\.agents\skills\plan-gate),刷新页面后技能出现在目录中;也可在对话中直接用 /plan-gate 显式调用。

安装(本地 link,当前 DSH 版本)

DSH 目前没有发布这些包到 npm,用 profile 的 link: 安装:

1) 克隆本仓库
git clone https://github.com/pengxiaozi/dsh-plugins.git

2) 在 DSH profile 目录安装(Windows 默认 %DSH_HOME%\profiles\<profile>)
cd "$DSH_HOME/profiles/desktop"
pnpm add "link:<repo>/dsh-mcp-panel"
pnpm add "link:<repo>/dsh-skill-panel"
pnpm add "link:<repo>/dsh-sensitive-mask"
pnpm add "link:<repo>/dsh-sec-checklist"
pnpm add "link:<repo>/dsh-runtime-inspector"
pnpm add "link:<repo>/dsh-session-exporter"

3) 在 profile package.json 的 dsh.profile.bundles 末尾追加: "dsh-mcp-panel", "dsh-skill-panel", "dsh-sensitive-mask", "dsh-sec-checklist", "dsh-runtime-inspector", "dsh-session-exporter" 或在 profile 的 cordis.patch.yml 里用 loader insert 行加载(推荐,宿主回写 bundles 时不会丢)

4) 刷新 DSH 页面(Ctrl+F5);未出现则重启 DSH

卸载:从 bundles 移除六个名字,pnpm remove dsh-mcp-panel dsh-skill-panel dsh-sensitive-mask dsh-sec-checklist dsh-runtime-inspector dsh-session-exporter,删除插件目录。

兼容性

- 已在 DeepSeek Harness 0.2.1-rc.1 ~ 0.2.1-rc.3 验证(Windows 桌面版,desktop 配置档 / web 面);
- 只使用公开插件面:webServer、loader、configEditor、tools、skills、profileContext;运行时透视另外使用 connection、events(活事件表)、sessions、approval、workspaceRegistry、systemPrompt;会话导出另外使用 connection、sessionPersistence(含冷会话)、workspaceRegistry、sessions、workingDirectory;
- 不依赖任何第三方运行时依赖,插件代码只用 Node 内置模块;运行时透视读取宿主包源码时,限定在安装目录的 node_modules/@deepseek-ai/ 内。

安全与隐私

- 不收集、不上传任何数据:无遥测、无外部请求;列表、读写、导出全部在本机完成。
- MCP 面板会把服务器配置(含 headers 中的 Authorization 等令牌)以明文写入 profile 的 cordis.patch.yml。请勿把 profile 目录提交到公共仓库;建议优先使用 127.0.0.1 本地地址。
- Skills 面板只读:不修改、不删除 skill 文件;ZIP 在内存中生成后直接返回浏览器。
- 导出路径与技能名来自 DSH 技能目录(ctx.skills),不接受任意文件系统路径。
- 脱敏显示:规则与命中日志只保存在本机 profile;日志默认只记规则、脱敏结果、长度与 hash,不记原文(可在设置里显式打开);占位符映射只在进程内存中,重启即清空;插件不发起任何外部请求。
- 安全清单:项目、授权、范围、测试账号只保存在本机 profile(sec-checklist.json);密码为本地明文,默认不会写进运行时技能或模型上下文(需在设置里显式打开「把密码写进清单」);插件不内置任何真实凭据,不发起外部请求。
- 运行时透视只读:所有 /dsh-runtime-inspector/ 路由先过 ctx.connection.requestRejection(Host/Origin + 登录 cookie),未登录返回 401;插件只观察 system-prompt/assemble、llm/stream、tools/ 等事件并原样 next(),不写配置、不改 system prompt、不注入内容、无外部请求;source 路由只能读安装目录 @deepseek-ai 包内文件并拒绝路径穿越;拦截记录只存在进程内存环形缓冲(200 条,插件重载即清空)。
- 会话导出只读 + 限定写入:/dsh-session-exporter/ 同样先过 ctx.connection.requestRejection;读取走 ctx.sessionPersistence 的校验式日志,不直接读 JSONL 文件;唯一的写操作「导出到工作区」只接受已注册工作区目录,文件固定写入 <workspace>/dsh-session-exports/<时间戳>/,不接受任意路径;附件只导出事件里的引用,不复制二进制;无外部请求。

开发与测试

每个插件目录下都有自包含测试:

node dsh-mcp-panel/test/smoke.mjs
node dsh-skill-panel/test/smoke.mjs
node dsh-skill-panel/test/host-routes.mjs # 用假 ctx 跑通 state/body/export 路由
node dsh-sensitive-mask/test/smoke.mjs
node dsh-sensitive-mask/test/host-routes.mjs
node dsh-sec-checklist/test/smoke.mjs
node dsh-sec-checklist/test/host-routes.mjs # 假 ctx:运行时技能注册、state/config/preview/doc/reveal/reset
node dsh-runtime-inspector/test/smoke.mjs # 纯函数:常量/默认值解析、prompt 渲染、钩子归属、规则快照
node dsh-runtime-inspector/test/host-routes.mjs # 假 ctx 跑通 apply()、HTTP 路由、鉴权拒绝与工具注册
node dsh-session-exporter/test/format.mjs # 纯函数:md/json/jsonl/qa 格式化、统计、文件名
node dsh-session-exporter/test/host-routes.mjs # 假 ctx:列表、单会话导出、ZIP、保存、工具

修改 host 代码后,在 profile 里触发一次配置重载(例如改一下 cordis.patch.yml 的时间戳内容),或重启 DSH,新代码才会生效。

DeepSeek Harness 的六个社区插件:dsh-mcp-panel(在设置里查看和编辑 MCP 连接)、dsh-skill-panel(浏览技能并导出为 ZIP)、dsh-sensitive-mask(在用户输入和工具结果到达模型之前做脱敏,支持占位符 / 部分 / 固定三种样式,并写本地审计日志)、dsh-sec-checklist(渗透测试清单,可配置项目 / 范围 / 凭据,可选渗透测试技能,并生成一个智能体能加载的 security-checklist 运行时技能)、dsh-runtime-inspector(只读的运行时检查器:实时事件钩子表,带 Loader 包归属;运行时拦截决策;审批 / 拦截 / 工作区规则;真实的系统提示词组装链与渲染后的提示词;宿主包字符串常量与 schema 默认值)和 dsh-session-exporter(把工作区的每个会话导出为 Markdown / 无损 JSON / NDJSON / 问答 JSON / 事件索引,可下载 ZIP 或把文件写进工作区,再让智能体把导出内容提炼成 Markdown 文档)。全部在本地运行,无遥测、无外部请求。在你的 DSH 配置档里用 pnpm add link:<path> 安装,并把包名追加到 dsh.profile.bundles。

License

MIT © 2026 pengxiaozi
预览分享卡片长什么样 ↓pengxiaozi/dsh-plugins
分享 · DeepSeek Harness Hub
pengxiaozi/dsh-plugins

DeepSeek Harness 社区插件:MCP 连接管理面板 + Skills 管理面板ZIP 导出

这是你的仓库?认领条目

回到顶部