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

插件集 cl19940824/dsh-plugins

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

按需安装十一个插件,扩展用量统计、局域网访问与界面定制

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 12 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 66 处,展示前 62 条)
  • 读取本地文件
    batch_install/batch-install.mjs:67
    return JSON.parse(await readFile(path, 'utf8'))
  • 读取本地文件
    batch_install/batch-install.mjs:104
    hasClient: typeof clientEntry === 'string' && existsSync(join(dir, clientEntry)),
  • 读取本地文件
    batch_install/batch-install.mjs:105
    hasPatch: existsSync(join(dir, patch)),
  • 读取本地文件
    batch_install/batch-install.mjs:111
    if (existsSync(join(dir, 'manifest.json'))) {
  • 读取本地文件
    batch_install/batch-install.mjs:121
    hasClient: existsSync(join(dir, 'lib/client.js')),
  • 读取本地文件
    batch_install/batch-install.mjs:138
    return (await stat(path)).isDirectory()
  • 发起网络请求
    batch_install/lib/client.js:626
    const response = await fetch(SCAN_URL, {
  • 读取本地文件
    context_1m/context-1m.mjs:123
    for (const entry of readdirSync(profilesRoot, { withFileTypes: true })) {
  • 读取本地文件
    context_1m/context-1m.mjs:128
    if (!existsSync(marker) || !existsSync(patch)) continue
  • 读取本地文件
    context_1m/context-1m.mjs:129
    const rec = { dir, patchMtime: statSync(patch).mtimeMs }
  • 读取本地文件
    context_1m/context-1m.mjs:159
    if (candidate.length > 0 && existsSync(candidate)) {
  • 写入本地文件
    context_1m/context-1m.mjs:220
    writeFileSync(tmp, content, 'utf8')
  • 写入本地文件
    context_1m/context-1m.mjs:221
    renameSync(tmp, file)
  • 读取本地文件
    context_1m/context-1m.mjs:255
    const doc = parseDocument(readFileSync(file, 'utf8'))
  • 读取本地文件
    context_1m/context-1m.mjs:297
    if (!existsSync(file)) throw new Error(`profile 补丁文件不存在:${file}`)
  • 发起网络请求
    context_1m/lib/client.js:77
    fetch(API_STATE + (qs ? "?" + qs : ""), { cache: "no-store" })
  • 发起网络请求
    context_1m/lib/client.js:101
    fetch(API_SET, {
  • 发起网络请求
    image_reader/image-reader.mjs:409
    const response = await fetch(url, { redirect: 'follow', signal: controller.signal })
  • 发起网络请求
    image_reader/lib/client.js:87
    const response = await fetch(API_CATALOG, { cache: "no-store" });
  • 发起网络请求
    image_reader/lib/client.js:108
    const response = await fetch(API_CONFIG, {
  • 读取本地文件
    lan_access/lan_access.mjs:126
    const parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    lan_access/lan_access.mjs:140
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lan_access/lan_access.mjs:141
    writeFileSync(tmp, JSON.stringify({ version: 1, ...state }, null, 2), 'utf8')
  • 写入本地文件
    lan_access/lan_access.mjs:142
    renameSync(tmp, path)
  • 发起网络请求
    lan_access/lib/proxy.mjs:172
    const request = http.request(
  • 发起网络请求
    lan_access/lib/proxy.mjs:415
    const upstream = http.request(
  • 发起网络请求
    multimodal/lib/client.js:45
    const data = await (await fetch(API, { cache: "no-store" })).json();
  • 发起网络请求
    multimodal/lib/client.js:51
    const data = await (await fetch(API, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ route, modelId, image }
  • 读取本地文件
    review/lib/engine.mjs:62
    if (!existsSync(path)) return null
  • 读取本地文件
    review/lib/engine.mjs:63
    return readFileSync(path, 'utf8')
  • 写入本地文件
    review/lib/engine.mjs:71
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    review/lib/engine.mjs:73
    writeFileSync(tmp, content, 'utf8')
  • 写入本地文件
    review/lib/engine.mjs:74
    renameSync(tmp, path)
  • 读取本地文件
    review/lib/engine.mjs:79
    return statSync(path).mtimeMs
  • 执行外部命令固定命令
    review/lib/engine.mjs:106
    execFile(
  • 读取本地文件
    review/lib/engine.mjs:131
    const parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    review/lib/engine.mjs:786
    entries = readdirSync(dir, { withFileTypes: true })
  • 写入本地文件
    review/lib/test-engine.mjs:34
    writeFileSync(abs, 'one\ntwo\nthree')
  • 写入本地文件
    review/lib/test-engine.mjs:36
    writeFileSync(abs, 'one\nTWO\nthree')
  • 读取本地文件
    review/lib/test-engine.mjs:43
    T('回退写盘 = 改动前', readFileSync(abs, 'utf8') === 'one\ntwo\nthree', JSON.stringify(readFileSync(abs, 'utf8')))
  • 读取本地文件
    review/lib/test-engine.mjs:45
    T('撤销写盘 = 改动后', readFileSync(abs, 'utf8') === 'one\nTWO\nthree')
  • 读取本地文件
    review/lib/test-engine.mjs:47
    T('重做写盘 = 改动前', readFileSync(abs, 'utf8') === 'one\ntwo\nthree')
  • 读取本地文件
    review/lib/test-engine.mjs:51
    T('持久化文件生成', readFileSync(join(dir, 'state.json'), 'utf8').includes('a.txt'))
  • 删除本地文件递归
    review/lib/test-engine.mjs:52
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    review/review.mjs:118
    afterText = readFileSync(pending.abs, 'utf8')
  • 读取本地文件
    review/review.mjs:148
    beforeText = readFileSync(abs, 'utf8')
  • 发起网络请求
    thinking_strength/lib/client.js:67
    fetch(API_STATE + (qs ? "?" + qs : ""), { cache: "no-store" })
  • 发起网络请求
    thinking_strength/lib/client.js:88
    fetch(API_SET, {
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:76
    for (const entry of readdirSync(profilesRoot, { withFileTypes: true })) {
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:81
    if (!existsSync(marker) || !existsSync(patch)) continue
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:82
    const rec = { dir, patchMtime: statSync(patch).mtimeMs }
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:112
    if (candidate.length > 0 && existsSync(candidate)) {
  • 写入本地文件
    thinking_strength/thinking-strength.mjs:173
    writeFileSync(tmp, content, 'utf8')
  • 写入本地文件
    thinking_strength/thinking-strength.mjs:174
    renameSync(tmp, file)
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:207
    const doc = parseDocument(readFileSync(file, 'utf8'))
  • 读取本地文件
    thinking_strength/thinking-strength.mjs:234
    if (!existsSync(file)) throw new Error(`profile 补丁文件不存在:${file}`)
  • 读取本地文件
    usage/usage.mjs:203
    const parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 写入本地文件
    usage/usage.mjs:216
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    usage/usage.mjs:217
    writeFileSync(tmp, JSON.stringify(state, null, 2), 'utf8')
  • 写入本地文件
    usage/usage.mjs:218
    renameSync(tmp, path)
  • 读取本地文件
    usage/usage.mjs:224
    return statSync(path).mtimeMs
  • 读取本地文件
    usage/usage.mjs:454
    const stat = statSync(path)
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

README

由 DeepSeek 最新模型翻译生成
dsh-plugins DeepSeek Harness(下称 dsh)的第三方插件集,共 11 个插件。每个插件都是一份完整包,分「宿主半边 + Web 客户端半边」:宿主半边在 Node 里采集数据、挂路由、改 profile 配置;客户端半边挂进启动图,往 Web 界面注入入口、面板或勾选框。 本仓库是社区插件集,与 DeepSeek 官方无关。插件通过 dsh 公开的 bundle / client-modules 机制接入,不修改 dsh 本体源码。 插件一览 | 目录 | 包名 | 干什么 | 形态 | 界面入口 | | usage/ | dsh-usage | 采集模型返回的 usage,按「天 × 模型」统计总 token,堆叠柱状图看各模型用量与占比 | legacy | 左下角(设置按钮上方) | | lan_access/ | dsh-lan-access | 带鉴权的反向代理 + 二维码接口,手机扫码在局域网里打开同一套界面(默认关闭) | legacy | 侧边栏 | | review/ | dsh-review | 把智能体每次 write / edit 的改动汇总成差异账本,逐块「保留 / 回退」,也能导入工作区 git 改动 | legacy | 侧边栏 |
展开完整文档(README 剩余 1 节)
dsh-plugins

DeepSeek Harness(下称 dsh)的第三方插件集,共 11 个插件。每个插件都是一份完整包,分「宿主半边 + Web 客户端半边」:宿主半边在 Node 里采集数据、挂路由、改 profile 配置;客户端半边挂进启动图,往 Web 界面注入入口、面板或勾选框。

本仓库是社区插件集,与 DeepSeek 官方无关。插件通过 dsh 公开的 bundle / client-modules 机制接入,不修改 dsh 本体源码。

插件一览

| 目录 | 包名 | 干什么 | 形态 | 界面入口 |
| usage/ | dsh-usage | 采集模型返回的 usage,按「天 × 模型」统计总 token,堆叠柱状图看各模型用量与占比 | legacy | 左下角(设置按钮上方) |
| lan_access/ | dsh-lan-access | 带鉴权的反向代理 + 二维码接口,手机扫码在局域网里打开同一套界面(默认关闭) | legacy | 侧边栏 |
| review/ | dsh-review | 把智能体每次 write / edit 的改动汇总成差异账本,逐块「保留 / 回退」,也能导入工作区 git 改动 | legacy | 侧边栏 |
| font/ | dsh-font | 全局界面字体 / 代码字体 / 字号缩放 / 文字色 / 背景色 | legacy | 设置 → 常规 |
| highlight/ | dsh-highlight | 给 shiki 未覆盖的语言(dart / objective-c / oc 等)代码块补关键词高亮 | legacy | 无 UI |
| multimodal/ | dsh-multimodal | 给自定义模型逐个开关「是否支持图片输入」(写 llm-pi-ai 的 input 模态) | legacy | 设置 → 模型 |
| chat_autoscroll/ | dsh-chat-autoscroll | 对话页流式输出智能吸底:停在底部自动跟随、往上翻则暂停 | legacy | 无 UI |
| context_1m/ | dsh-context-1m | 输入框模型选择器左边的「1M」勾选框:为当前模型写入 / 写回 contextWindow | bundle | 输入框 |
| thinking_strength/ | dsh-thinking-strength | 输入框模型选择器左边的「思考」勾选框:为当前模型补全 / 删除 reasoningEfforts 档位 | bundle | 输入框 |
| image_reader/ | dsh-image-reader | 给纯文本模型一双「借来的眼睛」:当前模型不支持图片输入时注入 read_image_details 工具,把「图片 + 问题」转发给指定的多模态模型,再把答案原样带回 | bundle | 设置 → 图像解读 |
| batch_install/ | dsh-batch-install | 插件安装体验补丁:选文件夹(走 dsh 自带的目录选择器,不用手输路径)+ 批量安装(扫出文件夹里的插件,勾选后一次装完,逐条报成功 / 需重启 / 失败) | bundle | 设置 → 插件(「批量安装」标签 + 添加菜单) |

两种插件形态

仓库里同时存在两代插件写法,安装器会按目录内容自动识别,不需要你手动区分。

1. bundle 形态(推荐,新)

判据:package.json 里有 dsh.bundle.patch。

- 是一份标准的 npm 包,package.json 声明 dsh.bundle.patch(宿主半边补丁)、 dsh.client.platform = "web"(浏览器半边)、engines.dsh 与 peerDependencies。
- 宿主半边由 cordis.patch.yml 以裸包标识符插入 profile 插件树,因此会进入 dsh 的 peer 兼容检查。
- 浏览器半边不用写补丁:dsh 的 client-modules 从入口往上找最近的 package.json,读到 dsh.client.platform === "web" 就按 exports["./client"] 自动挂进启动图。
- 采用:context_1m/、thinking_strength/、image_reader/、batch_install/

2. legacy 形态

判据:目录里有 manifest.json。

- 插件元信息写在 manifest.json(id / name / entry / patch / requiresRestart)。
- 安装 = 整目录复制到 profile 的 plugins/<id>/,再往 profile 的 cordis.patch.yml 追加一段带 id 的 insert 条目。
- 采用:usage/、lan_access/、review/、font/、highlight/、multimodal/、chat_autoscroll/

安装

整套安装(推荐)

git clone https://github.com/cl19940824/dsh-plugins.git
python3 ~/.dsh/skills/dsh-plugin-install/scripts/install_plugin.py ./dsh-plugins

安装器支持传入单个插件目录或整个仓库根(自动识别每个子目录的形态),装完按提示 菜单 → 重启服务才生效。

只装某一个 bundle 插件

直接作为 npm 依赖挂进 profile
pnpm add <本仓库路径>/context_1m

或走 CLI 的 link: 协议
dsh plugin add link:<本仓库路径>/context_1m

装完默认启用,并出现在 profile package.json 的 dsh.profile.bundles 数组里。

bundle 插件首次添加后必须重启一次。dsh 的 profile-resolution-bootstrap 在开机时把每个 link: 依赖的解析路由固化成内存表,运行中新增的链接目录在宿主进程里解析不到宿主安装树,会以 MODULE_NOT_FOUND → failed to import 收场。
验证方式:设置 → 插件里看条目是否 active。

目录约定

每个插件目录都是一份完整、自包含的插件包:

| 文件 | 作用 |
| package.json | 包清单:dsh.bundle.patch、dsh.client、exports["./client"]、peerDependencies |
| manifest.json | legacy 形态的元信息:id / name / entry 等 |
| <entry>.mjs | 宿主半边(在 Node 里跑:采集、路由、持久化、改配置) |
| lib/client.js | 浏览器半边(挂进启动图,渲染界面) |
| cordis.patch.yml | 插件自带的插入片段 |
| locale/.json | bundle 列表里显示的标题 / 简介(部分插件有) |
| README.md | 插件自己的说明(实现细节、边界、已知行为) |

开发须知

@deepseek-ai/ 必须声明在 peerDependencies 里

宿主半边里 import z from '@deepseek-ai/schemastery' 这类裸说明符,由 dsh 的 profile-resolution-bootstrap 路由到宿主安装树。但每个被 import 的包名都必须出现在本插件 package.json 的 peerDependencies 中——解析器对 linked 目录里的裸包请求,只有祖先 package.json 在 peerDependencies 里列了这个名字才会拦到宿主条目,否则走 native 解析,以 ERR_MODULE_NOT_FOUND 失败,整条插件行变成 inactive (plugin_manager list_plugins 里 enabled: true 但 fiberPhase: null)。

声明 peer 不需要跑 pnpm install,运行时按声明映射到 dsh 自带的副本。

宿主半边改动要重启

linked 插件目录不在 dsh-hmr 的 watch root 里(watch root 是 profile 目录,且忽略 /node_modules),宿主 Node 的 ESM 模块缓存会一直持着旧代码,set_plugin 反复开关只会反复执行旧模块的 apply。重启是唯一可靠的加载方式**;客户端半边改动则会被 client-modules 轮询到并热替换,不用重启(保险起见再刷一次页面)。

新增一个插件

1. 新建 <插件名>/ 目录,按上表补齐文件。
2. 在本 README 的「插件一览」表里加一行。
3. 用安装器装一遍验证:python3 ~/.dsh/skills/dsh-plugin-install/scripts/install_plugin.py ./<插件名>

安装脚本是按目录自动发现的(判据:package.json 的 dsh.bundle.patch,或 manifest.json),不需要改动脚本本身。

版本要求

| 形态 | 要求 |
| bundle | dsh >=0.2.0-rc.2 <0.3.0(以各插件 package.json 的 engines.dsh 为准) |
| legacy | 未声明版本约束,面向随桌面版分发的形态设计 |

数据落盘

legacy 插件的数据落在桌面版注入的 DSH_UI_DATA_DIR (macOS:~/Library/Application Support/DeepSeekHarness/data/,Windows:%LOCALAPPDATA%\DeepSeekHarness\data\)下,跟 config.json 同处,不写进插件目录——font/ 例外,它没有宿主侧状态,设置存在浏览器 localStorage。bundle 插件各自读写 dsh 自身的配置或数据目录,详见各插件 README。

许可

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

按需安装十一个插件,扩展用量统计、局域网访问与界面定制

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部