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

本地工具箱 HiWhaleW/dsh-toolbox

DeepSeek Harnessv0.1.0
HiWhaleW19 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 的本地优先工具箱。

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add HiWhaleW/dsh-toolbox
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · tool
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-toolbox @ 0.1.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 11:48:09

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 77 处,展示前 67 条)
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:34
    mkdirSync(this.dataDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:43
    try { chmodSync(path, 0o600) } catch {}
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:56
    const path = await realpath(resolve(String(input)))
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:66
    const manifest = JSON.parse(await readFile(join(item.path, 'package.json'), 'utf8'))
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:71
    try { entries = await readdir(item.path, { withFileTypes: true }) } catch (error) { errors.push({ path: item.path, error: error.message }); continue }
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:84
    try { manifest = JSON.parse(await readFile(path, 'utf8')) } catch (error) { throw new Error(`Cannot read target manifest: ${error.message}`) }
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:107
    try { pluginPath = await realpath(resolve(String(input))) } catch (error) {
  • 读取本地文件
    packages/compatibility-radar/src/radar.js:112
    try { manifest = JSON.parse(await readFile(join(pluginPath, 'package.json'), 'utf8')) } catch (error) {
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:187
    await mkdir(directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:191
    const path = join(directory, `compatibility_${stamp}.md`); await writeFile(path, markdown, { mode: 0o600 }); await chmod(path, 0o600); reports.push({
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:191
    const path = join(directory, `compatibility_${stamp}.md`); await writeFile(path, markdown, { mode: 0o600 }); await chmod(path, 0o600); reports.push({
  • 写入本地文件
    packages/compatibility-radar/src/radar.js:194
    const path = join(directory, `compatibility_${stamp}.html`); await writeFile(path, this.html(diff), { mode: 0o600 }); await chmod(path, 0o600); report
  • 读取本地文件
    packages/compatibility-radar/src/tools.js:29
    .map(root => realpath(resolve(String(root)))))
  • 读取本地文件
    packages/compatibility-radar/src/tools.js:36
    const target = await realpath(resolveInput(input, exec))
  • 读取本地文件
    packages/compatibility-radar/src/tools.js:49
    const target = await realpath(resolveInput(input, exec))
  • 写入本地文件
    packages/context-switchboard/src/switchboard.js:36
    mkdirSync(this.dataDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/context-switchboard/src/switchboard.js:58
    try { chmodSync(path, 0o600) } catch {}
  • 写入本地文件
    packages/dsh-switchboard/src/cli.js:92
    await writeFile(outputPath, JSON.stringify(plan, null, 2) + '\n', { mode: 0o600 })
  • 读取本地文件
    packages/dsh-switchboard/src/cli.js:97
    const plan = JSON.parse(await readFile(resolve(args[0]), 'utf8'))
  • 读取本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:53
    try { return await lstat(path) } catch (error) {
  • 读取本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:67
    return { info, raw: await readFile(path) }
  • 读取本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:117
    const packageDir = await realpath(candidate.path)
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:185
    await rename(temporary, path)
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:186
    try { await chmod(path, mode) } catch {}
  • 删除本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:189
    try { await unlink(temporary) } catch {}
  • 读取本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:228
    try { entries = await readdir(this.profilesDir, { withFileTypes: true }) } catch (error) {
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:362
    try { await mkdir(directory, { mode: 0o700 }) } catch (error) { if (error.code !== 'EEXIST') throw error }
  • 读取本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:363
    info = await lstat(directory)
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:366
    try { await chmod(directory, 0o700) } catch {}
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:368
    await mkdir(backupDir, { mode: 0o700 })
  • 写入本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:371
    await writeFile(join(backupDir, PROFILE_MANIFEST), manifest.raw, { mode: 0o600 })
  • 删除本地文件递归
    packages/dsh-switchboard/src/dsh-adapter.js:389
    await rm(backupDir, { recursive: true, force: true })
  • 删除本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:423
    try { await unlink(lockPath) } catch {}
  • 删除本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:451
    if (currentPatch) await unlink(current.patchPath)
  • 删除本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:478
    else if (await optionalLstat(current.patchPath)) await unlink(current.patchPath)
  • 删除本地文件
    packages/dsh-switchboard/src/dsh-adapter.js:486
    try { await unlink(lockPath) } catch {}
  • 读取本地文件
    packages/dsh-switchboard/src/store.js:14
    const info = lstatSync(this.dataDir)
  • 写入本地文件
    packages/dsh-switchboard/src/store.js:18
    mkdirSync(this.dataDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/dsh-switchboard/src/store.js:20
    try { chmodSync(this.dataDir, 0o700) } catch {}
  • 读取本地文件
    packages/dsh-switchboard/src/store.js:23
    const info = lstatSync(this.path)
  • 写入本地文件
    packages/dsh-switchboard/src/store.js:63
    try { chmodSync(path, 0o600) } catch {}
  • 写入本地文件
    packages/plugin-preflight/index.js:12
    mkdirSync(dataDir, { recursive: true, mode: 0o700 })
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:29
    for (const entry of await readdir(directory, { withFileTypes: true })) {
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:33
    const info = await lstat(absolute)
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:85
    const rootInfo = await lstat(root)
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:97
    try { manifest = JSON.parse(await readFile(manifestFile.absolute, 'utf8')) } catch { throw new Error('package.json is not valid JSON') }
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:113
    const patchText = await readFile(join(root, normalized), 'utf8')
  • 读取本地文件
    packages/plugin-preflight/src/preflight.js:147
    const text = await readFile(file.absolute, 'utf8')
  • 读取本地文件
    packages/plugin-preflight/src/tools.js:15
    const target = await realpath(resolve(isAbsolute(value) ? value : resolve(cwd, value)))
  • 读取本地文件
    packages/plugin-preflight/src/tools.js:20
    const realRoots = await Promise.all(roots.map(root => realpath(resolve(String(root)))))
  • 写入本地文件
    packages/plugin-preflight/src/tools.js:52
    await mkdir(directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/plugin-preflight/src/tools.js:57
    await writeFile(markdownPath, result.markdown, { mode: 0o600 })
  • 写入本地文件
    packages/plugin-preflight/src/tools.js:58
    await writeFile(htmlPath, formatPreflightHtml(result), { mode: 0o600 })
  • 写入本地文件
    packages/plugin-preflight/src/tools.js:59
    await chmod(markdownPath, 0o600); await chmod(htmlPath, 0o600)
  • 写入本地文件
    packages/product-research-workbench/src/database.js:111
    mkdirSync(dirname(path), { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/product-research-workbench/src/database.js:115
    try { chmodSync(path, 0o600) } catch {}
  • 发起网络请求
    packages/product-research-workbench/src/network.js:87
    const request = transport.request(url, {
  • 写入本地文件
    packages/product-research-workbench/src/report.js:139
    await mkdir(directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/product-research-workbench/src/report.js:144
    await writeFile(path, renderMarkdown(snapshot), { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    packages/product-research-workbench/src/report.js:145
    await chmod(path, 0o600)
  • 写入本地文件
    packages/product-research-workbench/src/report.js:150
    await writeFile(path, renderHtml(snapshot), { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    packages/product-research-workbench/src/report.js:151
    await chmod(path, 0o600)
  • 写入本地文件
    packages/product-research-workbench/src/workbench.js:19
    mkdirSync(this.config.dataDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/product-research-workbench/src/workbench.js:116
    await mkdir(directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    packages/product-research-workbench/src/workbench.js:118
    await writeFile(path, JSON.stringify(document, null, 2), { mode: 0o600 }); await chmod(path, 0o600)
  • 写入本地文件
    packages/product-research-workbench/src/workbench.js:118
    await writeFile(path, JSON.stringify(document, null, 2), { mode: 0o600 }); await chmod(path, 0o600)
  • 删除本地文件递归
    packages/product-research-workbench/src/workbench.js:171
    await rm(reportDirectory, { recursive: true, force: true })
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

界面预览

1 张 · 点击查看大图

功能亮点

  • 产品调研
  • 上下文路由
  • 插件预检与兼容性监控

本地优先的 DeepSeek Harness 插件,用于产品调研、上下文路由、插件预检和兼容性监控。

README

由 DeepSeek 最新模型翻译生成
DSH Toolbox DeepSeek Harness 的本地优先工具箱。 产品调研、上下文切换、插件预检、兼容性监控,全都收进一个以安全为核心的图形控制面板。 在线交互演示 五分钟安装 反馈问题 [!NOTE] 在线版本是安全的演示:健康检查、Bundle 开关、变更计划、活动记录和回滚都在当前浏览器内存里模拟,刷新即重置。它绝不会连接访客的电脑,也不会读取 DSH 配置档、API 凭据或 SQLite 数据。想接入真实的 DSH 工作流,请安装本地版本。 [!IMPORTANT] 实验性 MVP · 仅限非商业用途。 DeepSeek Harness 仍处于 Developer Preview 阶段,升级可能影响配置档 Bundle 的兼容性。本项目独立开发,与 DeepSeek 无隶属关系,也未获其背书。 DSH Toolbox 是什么? DSH Toolbox 是 DeepSeek Harness 的配套工具,面向个人、本地优先的工作流。四个插件以原生 DSH 配置档 Bundle 的形式运行。DSH Switchboard 跑在活动的 Harness 进程之外,用来检查配置档、跑健康检查、预览 Bundle 变更、创建备份,并安全回滚变更。 默认没有账号、没有托管后端、没有行为分析、没有遥测、没有后台注册表检查,也不会自动升级。
展开完整文档(README 剩余 1 节)
DSH Toolbox

DeepSeek Harness 的本地优先工具箱。
产品调研、上下文切换、插件预检、兼容性监控,全都收进一个以安全为核心的图形控制面板。

在线交互演示

五分钟安装

反馈问题

[!NOTE]
在线版本是安全的演示:健康检查、Bundle 开关、变更计划、活动记录和回滚都在当前浏览器内存里模拟,刷新即重置。它绝不会连接访客的电脑,也不会读取 DSH 配置档、API 凭据或 SQLite 数据。想接入真实的 DSH 工作流,请安装本地版本。

[!IMPORTANT]
实验性 MVP · 仅限非商业用途。 DeepSeek Harness 仍处于 Developer Preview 阶段,升级可能影响配置档 Bundle 的兼容性。本项目独立开发,与 DeepSeek 无隶属关系,也未获其背书。

DSH Toolbox 是什么?

DSH Toolbox 是 DeepSeek Harness 的配套工具,面向个人、本地优先的工作流。四个插件以原生 DSH 配置档 Bundle 的形式运行。DSH Switchboard 跑在活动的 Harness 进程之外,用来检查配置档、跑健康检查、预览 Bundle 变更、创建备份,并安全回滚变更。

默认没有账号、没有托管后端、没有行为分析、没有遥测、没有后台注册表检查,也不会自动升级。真实运行时数据留在本地 SQLite。配置档变更一律先出计划,写入前需要用户确认,并留下可审计的事务记录。

五个组件

| 组件 | 日常用途 | 工具数 |
| @dsh-toolbox/product-research-workbench | 导入 URL 或文本证据,整理发现,评估机会,备份项目,生成 Markdown/HTML 报告。 | 12 |
| @dsh-toolbox/context-switchboard | 把任务路由到有界上下文,激活原生运行时上下文,并支持回滚。 | 10 |
| @dsh-toolbox/plugin-preflight | 安装前检查本地 Bundle,涵盖包语义、能力、策略、SBOM 数据和指纹。 | 2 |
| @dsh-toolbox/compatibility-radar | 发现 Bundle,与目标运行时对比,保存并比较快照,生成升级报告。 | 7 |
| @dsh-toolbox/dsh-switchboard | 发现 DSH 配置档,检查 Bundle,规划并校验变更,创建备份和报告,安全回滚。 | 命令行 / 控制平面 |

前四个组件是各自独立安装的 DSH 配置档 Bundle。第五个是统一的本地控制平面。Product Research Workbench 及相关报告支持 Markdown 和 HTML 输出,运行时数据默认存入 SQLite。

在线演示 vs. 本地安装

| 能力 | 在线演示 | 本地安装 |
| 浏览四个视图和固定活动侧边栏 | 可用 | 可用 |
| 切换配置档、筛选活动、查看 Bundle 方案 | 在浏览器内存中模拟 | 连接真实本地数据 |
| 运行 dsh --dump-config 健康检查 | 模拟成功结果 | 真实执行命令 |
| 写入配置档、创建备份、回滚、生成报告 | 不写入;刷新后重置 | 确认方案后真实执行 |
| 数据去向 | 当前浏览器内存 | 用户电脑上的 SQLite 和私有目录 |

环境要求

- Node.js ^22.19.0 || >=24.0.0(内置 node:sqlite)
- npm,用于打包本地 bundle
- @deepseek-ai/dsh@0.1.1-rc.2
- 一个你有权修改的本地 DSH 配置档

只读的 Switchboard 检查不需要 PATH 上有 DSH 命令行。应用或回滚变更默认需要命令行,因为 dsh --profile <name> --dump-config 成功执行才是运行时安全闸门。

经过测试的运行时组合如下:

| 组件 | 测试版本 |
| DeepSeek Harness | 0.1.1-rc.2 |
| DSH Tools | 0.1.1-rc.2 |
| Cordis | 4.0.1 |
| Node.js | 24.x 以及声明的 22.19+ 范围 |

CI 在 Ubuntu 上以 Node.js 22.19.0 和 24.x 运行完整的检查与打包 dry-run 矩阵。另有 windows-latest 任务,验证 Switchboard 能否在不启用 shell 执行的情况下检测并执行 npm 安装的 dsh.cmd shim。

如果还没有固定版本的 DSH 命令行,先安装:

npm install --global @deepseek-ai/dsh@0.1.1-rc.2
dsh --version

五分钟安装

克隆源码,创建四个 npm tarball,然后安装到一个 DSH 配置档:

git clone https://github.com/HiWhaleW/dsh-toolbox.git
cd dsh-toolbox

mkdir -p dist
npm pack --workspace @dsh-toolbox/product-research-workbench --pack-destination dist
npm pack --workspace @dsh-toolbox/context-switchboard --pack-destination dist
npm pack --workspace @dsh-toolbox/plugin-preflight --pack-destination dist
npm pack --workspace @dsh-toolbox/compatibility-radar --pack-destination dist

dsh plugin --profile toolbox add ./dist/dsh-toolbox-product-research-workbench-0.2.1.tgz
dsh plugin --profile toolbox add ./dist/dsh-toolbox-context-switchboard-0.2.1.tgz
dsh plugin --profile toolbox add ./dist/dsh-toolbox-plugin-preflight-0.2.1.tgz
dsh plugin --profile toolbox add ./dist/dsh-toolbox-compatibility-radar-0.2.1.tgz

dsh --profile toolbox --dump-config

最后一条命令应该会显示全部四个 bundle 层。用同一个配置档启动 DSH: sh
dsh --profile toolbox

你也可以只安装自己需要的 tarball。打包不会执行插件代码,也不需要先装好仓库依赖。在仓库根目录执行 npm install 之后,也可以直接从 checkout 路径安装,但 tarball 更符合 npm 打包语义,是经过验证的可移植流程。

每个包都固定了少量 DSH 工具定义运行时,用来保证在树外安装时也能可靠运行。没有安装生命周期脚本。

打开 DSH Switchboard GUI

DSH Switchboard 是 DeepSeek Harness 的本地设置应用。它会显示装了哪些配置档和配置档 bundle,检查某个配置档能否启动,预览每一处改动,并保留备份,以便安全回滚。

导航会在中间面板打开四个工作视图:

- DSH Profiles —— 查看配置档,运行它的 DSH 健康检查,查看已安装的 bundle,规划启用/停用改动。
- Plugins —— 查看 bundle 清单及其兼容性状态。
- Activity —— 查看本地计划、校验、已应用的改动和回滚。
- Settings —— 查看检测到的 DSH 运行时和本地数据位置。

你在视图之间切换时,右侧会一直显示最近的活动记录。长列表在各自面板内部滚动,所以整个应用框架保持固定,始终清晰可读。

本地备份对话框还有一个明确的 Back up now 操作。这些手动配置档快照之后可以恢复;恢复某个快照之前,Switchboard 会先把当前配置档保存为新的恢复点,然后恢复选中的快照,并运行 DSH 配置校验。如果校验失败,它会尝试自动回到那个恢复点。

从仓库 checkout 运行: sh
pnpm install --frozen-lockfile
pnpm switchboard:gui

然后打开 http://127.0.0.1:4173/。服务器只监听本机。它从 $DSH_HOME/profiles 读取配置档,从不显示 API 凭据的值,写入配置档文件之前必须先经过一步确认。

从命令行使用 DSH Switchboard

Switchboard 目前是以源码分发的技术预览版,不是任何 DSH 配置档的 npm 依赖。从 checkout 运行: sh
npm run switchboard -- detect
npm run switchboard -- profiles
npm run switchboard -- inspect toolbox
npm run switchboard -- health toolbox
npm run switchboard -- backup toolbox

backup 命令会立刻把当前配置档保存成可恢复的快照,存放在 Switchboard 的私有本地数据目录里。恢复手动快照时,会先创建一个新的恢复点,再用 DSH 校验恢复后的配置档。

变更类命令都先出计划,只有带上 --apply 才会真正改动:

npm run switchboard -- bundle disable toolbox @dsh-toolbox/context-switchboard
npm run switchboard -- bundle disable toolbox @dsh-toolbox/context-switchboard --apply
npm run switchboard -- history

Switchboard 会保留 SHA-256 状态指纹、原子写入备份和 SQLite 回执。它会拒绝过期计划,也不会在用户后续编辑之后强行回滚。参见 Switchboard README 和 architecture RFC。

如何使用这些插件

这些包在 DSH 内部注册工具,并不是独立的 shell 命令。让智能体运行指定的工具,或者描述你想要的结果,由 DSH 来挑选。

Product Research Workbench

建议流程:

research_create → research_add_source → research_extract
→ research_evidence_add (optional human correction)
→ research_analyze → research_report

示例请求:

Create a research project called "Local AI research workflows".
Import this pasted interview text, extract evidence, analyze the opportunities,
and generate both Markdown and HTML reports.

URL 导入接受公开、无需认证的 http(s) 页面。默认会拦截 loopback、私有、link-local、metadata 以及其他非公开目标。需要认证的抓取、浏览器 cookie、绕过 CAPTCHA、社交媒体爬取都不在 MVP 范围内。

Context Switchboard

建议流程:

context_profile_save → context_route → context_activate
→ context_current / context_history → context_rollback

示例请求:

Save a context profile named "DSH plugin development" with the keywords
"dsh", "cordis", and "plugin"; use a 1,200-token budget. Route this task,
activate the best profile, and show me the activation receipt.

激活走的是 DSH 原生的 systemPrompt.context() 注册表。它只贡献一份有大小限制的运行时上下文快照,不会替换部署人设、沙箱策略或审批策略。

Plugin Preflight

示例请求:

Run plugin_preflight_scan on packages/context-switchboard and explain every
finding before I install it. Then create the Markdown and HTML audit report.

Preflight 是静态、只读的:它不运行脚本、不安装依赖、不跟随符号链接、也不访问注册表。扫描干净并不等于安全保证。

Compatibility Radar

示例请求:

Discover DSH bundles under packages, check them against DSH Tools 0.1.1-rc.2,
Cordis 4.0.1 和你当前的 Node 版本,然后保存一份兼容性快照。

改动 DSH 或 Cordis 版本之前,再保存一份快照,用 compatibility_diff 或 compatibility_report 找出回归问题。Radar 从不自动升级软件。

本地数据与输出

| 插件 | 默认本地数据 |
| Product Research Workbench | ~/.local/share/dsh-toolbox/product-research-workbench |
| Context Switchboard | ~/.local/share/dsh-toolbox/context-switchboard |
| Plugin Preflight | ~/.local/share/dsh-toolbox/plugin-preflight |
| Compatibility Radar | ~/.local/share/dsh-toolbox/compatibility-radar |
| DSH Switchboard | ~/.local/share/dsh-toolbox/dsh-switchboard |

这些插件和控制平面使用 SQLite,并在适用时生成 Markdown 和自包含 HTML 报告。生成的报告不加载任何远程脚本。仓库的 .gitignore 已排除运行时数据库、报告、导出、会话、环境文件和 cookie,但每次提交前你仍应检查暂存的改动。

研究报告和导出可能包含源文本、引文、URL、本地路径、项目名称、受版权保护的材料或个人信息。分享前请先审阅。完整边界见 PRIVACY.md 和 SECURITY.md。

许可证:仅限非商业用途

DSH Toolbox 0.2.1 及更高版本以源码公开形式发布,采用 PolyForm Noncommercial License 1.0.0。

许可证允许的用途包括个人学习、研究、实验、业余项目、教育、慈善/非营利工作、公共研究、公共安全、环境保护,以及许可证定义的政府工作。

不允许商业用途。 不得将本软件、修改版本或衍生作品用于直接或间接的商业利益,包括付费产品或服务、创收运营、商业咨询交付物,或内部业务收益。若本摘要与许可证原文有出入,以许可证原文为准。

此限制适用于 DSH Toolbox 原始代码。DeepSeek Harness、Cordis、DSH Tools 及其他依赖仍遵循各自的许可证;见 THIRD_PARTY_NOTICES.md。

历史说明:此前已按 MIT 分发的旧版本副本,仍受随附于这些副本的授权约束。0.2.1 的许可证变更不追溯撤销已授予的权利。

贡献

贡献前请阅读 CONTRIBUTING.md 和行为准则。提交贡献即表示你同意其可按仓库当前的非商业许可证分发。
预览分享卡片长什么样 ↓HiWhaleW/dsh-toolbox
分享 · DeepSeek Harness Hub
HiWhaleW/dsh-toolbox

DeepSeek Harness 的本地优先工具箱。

回到顶部