按需安装十一个插件,扩展用量统计、局域网访问与界面定制
29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add cl19940824/dsh-plugins该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
cl19940824/dsh-plugins
按需安装十一个插件,扩展用量统计、局域网访问与界面定制
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,826已汉化DSH
72.2
花束设计alchaincyf/huashu-design
一句话生成网页、原型、PPT 与信息图等可交付设计
★ 28,638已汉化DSH
71.7
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。