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

Song 插件合集 Song-812/dsh-plugins-song

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

按需安装会话删除、消息提示、玻璃主题等小功能插件

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 91 处,展示前 84 条)
  • 执行外部命令来自配置/变量
    glass-theme/check.mjs:83
    const result = spawnSync(process.execPath, ['--check', path.join(root, file)], { encoding: 'utf8' })
  • 发起网络请求
    glass-theme/lib/client.js:1400
    const response = await fetch(`${BASE}/wallpaper`, { cache: "no-store" });
  • 发起网络请求
    glass-theme/lib/client.js:1410
    const response = await fetch(`${BASE}/wallpaper`, {
  • 发起网络请求
    glass-theme/lib/client.js:1419
    const response = await fetch(`${BASE}/wallpaper`, { method: "DELETE" });
  • 发起网络请求
    glass-theme/lib/client.js:1423
    const response = await fetch(`${BASE}/reveal`, { method: "POST" });
  • 发起网络请求
    glass-theme/lib/client.js:1450
    const response = await fetch(`${BASE}/wallpaper`, {
  • 发起网络请求
    glass-theme/lib/client.js:1625
    handle = scheduler.request(() => {
  • 执行外部命令固定命令
    glass-theme/lib/index.js:305
    spawn("explorer.exe", [WALLPAPER_DIR], { detached: true, stdio: "ignore" }).unref();
  • 发起网络请求
    global-rules/lib/client.js:206
    fetch(API_PATH, { cache: "no-store" })
  • 发起网络请求
    global-rules/lib/client.js:235
    fetch(API_PATH, {
  • 读取本地文件
    global-rules/lib/index.js:82
    return await readFile(file, 'utf8')
  • 写入本地文件
    global-rules/lib/index.js:96
    await writeFile(temp, content, 'utf8')
  • 读取本地文件
    global-rules/lib/index.js:97
    const readBack = await readFile(temp, 'utf8')
  • 写入本地文件
    global-rules/lib/index.js:99
    await rename(temp, file)
  • 删除本地文件
    global-rules/lib/index.js:101
    await rm(temp, { force: true })
  • 读取本地文件
    global-rules/lib/index.js:109
    const target = await realpath(file).catch(() => file)
  • 写入本地文件
    global-rules/lib/index.js:110
    await mkdir(dirname(target), { recursive: true })
  • 读取本地文件
    global-rules/lib/index.js:118
    const names = await readdir(directory)
  • 删除本地文件
    global-rules/lib/index.js:120
    await Promise.all(stale.map((entry) => unlink(join(directory, entry)).catch(() => {})))
  • 写入本地文件
    global-rules/lib/index.js:130
    await mkdir(directory, { recursive: true })
  • 执行外部命令来自配置/变量
    launch-animation/lib/artwork.js:153
    execFile(exe, args, { windowsHide: true, timeout: 60000, maxBuffer: 32 * 1024 * 1024, env }, (error, stdout, stderr) => {
  • 发起网络请求
    launch-animation/lib/client.js:400
    const response = await fetch(API_PATH, { cache: "no-store" });
  • 发起网络请求
    launch-animation/lib/client.js:420
    const response = await fetch(API_PATH, {
  • 发起网络请求
    launch-animation/lib/client.js:446
    const response = await fetch(API_PATH, {
  • 发起网络请求
    launch-animation/lib/client.js:482
    const response = await fetch(API_PATH, {
  • 发起网络请求
    launch-animation/lib/client.js:512
    const response = await fetch(API_PATH, {
  • 发起网络请求
    launch-animation/lib/client.js:670
    await fetch(API_PATH, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ action: "report", report }) });
  • 发起网络请求
    mcp-toggle/lib/client.js:395
    const response = await fetch(API_PATH, { cache: "no-store" });
  • 发起网络请求
    mcp-toggle/lib/client.js:773
    const response = await fetch(API_PATH, {
  • 读取本地文件
    mcp-toggle/lib/index.js:121
    entries = await readdir(profilesDir, { withFileTypes: true })
  • 读取本地文件
    mcp-toggle/lib/index.js:356
    const parsed = JSON.parse(stripBom(await readFile(join(home, STATE_FILE_NAME), 'utf8')))
  • 写入本地文件
    mcp-toggle/lib/index.js:384
    await writeFile(temp, `${JSON.stringify(state, null, 2)}\n`, 'utf8')
  • 写入本地文件
    mcp-toggle/lib/index.js:385
    await rename(temp, file)
  • 删除本地文件
    mcp-toggle/lib/index.js:389
    await unlink(temp)
  • 读取本地文件
    mcp-toggle/lib/index.js:494
    text = await readFile(file, 'utf8')
  • 发起网络请求
    plugins-panel/lib/client.js:923
    const response = await fetch(API_PATH, {
  • 发起网络请求
    plugins-panel/lib/client.js:981
    const response = await fetch(API_PATH, { cache: "no-store" });
  • 读取本地文件
    proxy-connect/lib/egress-whitelist.js:35
    raw = await readFile(filePath, 'utf8')
  • 读取本地文件
    proxy-connect/lib/index.js:37
    readFile: (file) => readFileSync(file, 'utf8'),
  • 写入本地文件
    proxy-connect/lib/index.js:111
    writeFileSync(DEBUG_LOG, '', 'utf8')
  • 写入本地文件
    proxy-connect/lib/index.js:119
    appendFileSync(DEBUG_LOG, `${new Date().toISOString()} ${JSON.stringify(record)}\n`, 'utf8')
  • 发起网络请求
    proxy-connect/lib/provider.js:30
    async fetch(request, signal) {
  • 发起网络请求
    proxy-connect/lib/undici-transport.js:14
    fetch(url, { method: 'GET', redirect: 'manual', headers, signal, dispatcher }),
  • 发起网络请求
    proxy-connect/lib/undici-transport.js:24
    fetch(url, { method: 'GET', redirect: 'manual', headers, signal, dispatcher }),
  • 读取本地文件
    proxy-connect/lib/whitelist.js:31
    raw = await readFile(filePath, 'utf8')
  • 读取本地文件
    proxy-connect/lib/whitelist.js:69
    raw = await readFile(filePath, 'utf8')
  • 写入本地文件
    proxy-connect/lib/whitelist.js:152
    await writeFile(temp, `${JSON.stringify([...hosts], null, '\t')}\n`, 'utf8')
  • 写入本地文件
    proxy-connect/lib/whitelist.js:153
    await rename(temp, filePath)
  • 删除本地文件
    proxy-connect/lib/whitelist.js:156
    await unlink(temp)
  • 执行外部命令来自配置/变量
    reasoning-effort/check.mjs:53
    const r = spawnSync(process.execPath, ["--check", full], { encoding: "utf8" });
  • 执行外部命令来自配置/变量
    reasoning-effort/check.mjs:98
    const r = spawnSync(process.execPath, ["--test", path.join(pluginDir, "test/switch-flow.test.mjs")], {
  • 发起网络请求
    reasoning-effort/lib/client.js:88
    fetch(TURBO_ROUTE, { method: "GET" })
  • 发起网络请求
    session-delete/lib/client.js:291
    const response = await fetch(path, {
  • 读取本地文件
    session-delete/lib/index.js:118
    return (await stat(path)).isDirectory()
  • 读取本地文件
    session-delete/lib/index.js:135
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    session-delete/lib/index.js:166
    if (existsSync(candidate)) caches.push(candidate)
  • 写入本地文件
    session-delete/lib/index.js:188
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    session-delete/lib/index.js:192
    if ((await readFile(file, 'utf8')) === BRIDGE_SCRIPT_SOURCE) return file
  • 写入本地文件
    session-delete/lib/index.js:197
    await writeFile(file, BRIDGE_SCRIPT_SOURCE, 'utf8')
  • 写入本地文件
    session-delete/lib/index.js:216
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    session-delete/lib/index.js:220
    await writeFile(inFile, JSON.stringify({ action, paths }), 'utf8')
  • 读取本地文件
    session-delete/lib/index.js:229
    if (!existsSync(outFile)) {
  • 读取本地文件
    session-delete/lib/index.js:234
    if (!existsSync(outFile)) return { ok: false, error: 'recycle bridge produced no output' }
  • 删除本地文件
    session-delete/lib/index.js:243
    await rm(inFile, { force: true }).catch(() => {})
  • 删除本地文件
    session-delete/lib/index.js:244
    await rm(outFile, { force: true }).catch(() => {})
  • 发起网络请求
    skills-toggle/lib/client.js:340
    ? await fetch(API_PATH, { cache: "no-store" })
  • 发起网络请求
    skills-toggle/lib/client.js:341
    : await fetch(API_PATH, {
  • 发起网络请求
    skills-toggle/lib/client.js:895
    const response = await fetch(API_PATH, {
  • 发起网络请求
    skills-toggle/lib/client.js:2025
    handle = frame.request(() => {
  • 读取本地文件
    skills-toggle/lib/index.js:133
    return await realpath(target)
  • 写入本地文件
    skills-toggle/lib/index.js:146
    await writeFile(staging, content, 'utf8')
  • 写入本地文件
    skills-toggle/lib/index.js:147
    await rename(staging, file)
  • 删除本地文件
    skills-toggle/lib/index.js:150
    await unlink(staging)
  • 读取本地文件
    skills-toggle/lib/index.js:514
    before = await readFile(file, 'utf8')
  • 读取本地文件
    skills-toggle/lib/index.js:614
    text = await readFile(file, 'utf8')
  • 读取本地文件
    skills-toggle/lib/index.js:692
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    skills-toggle/lib/index.js:704
    const dirMeta = await lstat(skillDir)
  • 读取本地文件
    skills-toggle/lib/index.js:711
    const info = await lstat(file)
  • 写入本地文件
    skills-toggle/lib/index.js:1059
    await writeFile(temp, payload, 'utf8')
  • 写入本地文件
    skills-toggle/lib/index.js:1060
    await rename(temp, file)
  • 删除本地文件
    skills-toggle/lib/index.js:1064
    await unlink(temp)
  • 发起网络请求
    ui-hide/lib/client.js:97
    const response = await fetch(API_PATH, {
  • 读取本地文件
    ui-hide/lib/index.js:72
    return normalizeConfig(JSON.parse(stripBom(await readFile(filePath, 'utf8'))))
  • 执行外部命令来自配置/变量
    web-connect/lib/index.js:22
    const child = spawn(command, args, {windowsHide: true, stdio: 'ignore'});
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

Song 自制的 DSH 插件合集,持续更新。A collection of DSH plugins by Song.

README

由 DeepSeek 最新模型翻译生成
dsh-plugins-song · Song 的 DSH 插件合集 Song 自制的 DSH 插件合集,持续更新。 平台说明:session-delete 依赖 Windows 回收站(powershell.exe + shell32),其它平台请勿安装。msg-notify 是纯客户端提醒;skills-toggle / mcp-toggle / plugins-panel 只写各自的 ~/.dsh/.json 显示偏好(及 skills 的 front matter);global-rules 编辑 $DSH_HOME/AGENTS.md(默认 ~/.dsh/AGENTS.md);proxy-connect 按名单分流抓网页与模型出网(默认本机代理端口,Node ≥ 22.19);web-connect 用本机一次性登录入口做界面验证 / 默认浏览器打开(验证模式需 chrome-devtools MCP)——以上都不依赖回收站。 它解决什么问题 DSH 桌面端没有现成的「一键删会话并进回收站」之类能力。这个合集把自用里反复用到的小能力拆成独立插件,装一个用一个,需要时再开源下一个。
展开完整文档(README 剩余 1 节)
dsh-plugins-song · Song 的 DSH 插件合集

Song 自制的 DSH 插件合集,持续更新。

平台说明:session-delete 依赖 Windows 回收站(powershell.exe + shell32),其它平台请勿安装。msg-notify 是纯客户端提醒;skills-toggle / mcp-toggle / plugins-panel 只写各自的 ~/.dsh/.json 显示偏好(及 skills 的 front matter);global-rules 编辑 $DSH_HOME/AGENTS.md(默认 ~/.dsh/AGENTS.md);proxy-connect 按名单分流抓网页与模型出网(默认本机代理端口,Node ≥ 22.19);web-connect 用本机一次性登录入口做界面验证 / 默认浏览器打开(验证模式需 chrome-devtools MCP)——以上都不依赖回收站。

它解决什么问题

DSH 桌面端没有现成的「一键删会话并进回收站」之类能力。这个合集把自用里反复用到的小能力拆成独立插件,装一个用一个,需要时再开源下一个。

插件一览

| 插件 | 目录 / 包名 | 状态 | 作用 |
| 会话删除 (Session Delete) | session-delete/ · dsh-session-delete | ✅ 已发布 | 会话行悬停垃圾桶:确认后把会话目录送进 Windows 系统回收站 |
| 消息提示 (Message Notice) | msg-notify/ · dsh-msg-notify | ✅ 已发布 | 需要回答 / 输出完成 / 发生错误 / 卡住:四类场景各配提示音(音色与重复可调) |
| 启动动画 (Boot Animation) | launch-animation/ · dsh-launch-animation | ✅ 已发布 | 开机线稿描边动画,盖住默认 Loading;可换身份图,可跳过 |
| 玻璃主题 (Glass Theme) | glass-theme/ · dsh-glass-theme | ✅ 已发布 | 壁纸 + 磨砂玻璃界面;重点色、悬停上浮、鼠标辉光 |
| 全局规则 (Global Rules) | global-rules/ · dsh-global-rules | ✅ 已发布 | 设置页编辑 AGENTS.md;保存 / 恢复默认(清空前自动备份) |
| 思考档位 (Thinking Levels) | reasoning-effort/ · dsh-reasoning-effort | ✅ 已发布 | 输入框模型区:推理档位滑条 + 加速档闪电开关 |
| 技能侧栏 (Skills Sidebar) | skills-toggle/ · dsh-skills-toggle | ✅ 已发布 | 侧栏管理技能的「模型 / 手动」开关;分组折叠、一键开关、拖动排序与搜索 |
| 插件侧栏 (Plugins Sidebar) | plugins-panel/ · dsh-plugins-panel | ✅ 已发布 | 侧栏管理自制插件开关;分组折叠、一键开关、拖动排序、搜索,并可跳转官方管理页 |
| MCP 侧栏 (MCP Sidebar) | mcp-toggle/ · dsh-mcp-toggle | ✅ 已发布 | 侧栏管理 MCP 服务器开关;分组折叠、一键开关、拖动排序与搜索 |
| UI 隐藏 (UI Hide) | ui-hide/ · dsh-ui-hide | ✅ 已发布 | 按清单隐藏不需要的界面入口;会话行上直接「重命名」 |
| 代理连接 (Proxy Connect) | proxy-connect/ · dsh-proxy-connect | ✅ 已发布 | 一个开关 + 一份名单:抓网页与模型出网分流(名单内走代理) |
| 网页连接 (Web Connect) | web-connect/ · dsh-web-connect | ✅ 已发布 | 验证自身界面(chrome-devtools)与按用户要求在默认浏览器打开已登录网页版 |
| MCP-OAuth 桥接 (MCP-OAuth Bridge) | — | 🚧 即将开源 | |

持续更新,敬请期待。

快速开始

1. 在 DSH 插件面板里选择对应子目录安装,或用 plugin_manager install_bundle 指向该子目录
2. 改了客户端半边(lib/client.js)要刷新页面;改了宿主半边(lib/index.js)要重新启用一次插件行(或重启)

环境要求

| 需要 | 说明 |
| Windows(仅 session-delete) | 回收站桥依赖 powershell.exe 与 shell32.dll。msg-notify 是纯客户端;skills-toggle / mcp-toggle / plugins-panel 只写各自的 ~/.dsh/.json 显示偏好(及 skills 的 front matter);global-rules 编辑 $DSH_HOME/AGENTS.md(默认 ~/.dsh/AGENTS.md);proxy-connect 按名单分流抓网页与模型出网(默认本机代理端口,Node ≥ 22.19);web-connect 用本机一次性登录入口做界面验证 / 默认浏览器打开(验证模式需 chrome-devtools MCP)——以上都不依赖回收站 |
| Node.js ≥ 18 | 跑插件测试时需要;装插件本身走 DSH |
| Node.js ≥ 22.19(仅 proxy-connect) | undici 8 要求;DSH 自带 Node 24 满足 |

项目结构

session-delete/ 会话删除插件(已发布) msg-notify/ 消息提示插件(已发布) skills-toggle/ 技能侧栏插件(已发布) mcp-toggle/ MCP 侧栏插件(已发布) plugins-panel/ 插件侧栏插件(已发布) global-rules/ 全局规则插件(已发布) proxy-connect/ 代理连接插件(已发布) web-connect/ 网页连接插件(已发布) ui-hide/ UI 隐藏插件(已发布) reasoning-effort/ 思考档位插件(已发布) launch-animation/ 启动动画插件(已发布) glass-theme/ 玻璃主题插件(已发布) LICENSE MIT README.md 中文说明 README.en.md English

测试

每个插件的测试都在该插件目录里用 npm test 运行(各插件的 package.json 都有 test 脚本)。回收站相关用例只在临时目录上建删还原,不碰真实 DSH 会话。

已知限制

- session-delete 只在 Windows 上能用(依赖系统回收站)。msg-notify 是纯客户端提醒;skills-toggle / mcp-toggle / plugins-panel 只写各自的 ~/.dsh/*.json 显示偏好(及 skills 的 front matter);global-rules 编辑 $DSH_HOME/AGENTS.md(默认 ~/.dsh/AGENTS.md);proxy-connect 按名单分流抓网页与模型出网(默认本机代理端口,Node ≥ 22.19);web-connect 用本机一次性登录入口(验证模式需 chrome-devtools MCP)——以上都不依赖回收站
- 「即将开源」的条目还在整理,目录与包名以后补上

许可证

MIT,见 LICENSE。© Song-812
预览分享卡片长什么样 ↓Song-812/dsh-plugins-song
分享 · DeepSeek Harness Hub
Song-812/dsh-plugins-song

按需安装会话删除、消息提示、玻璃主题等小功能插件

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