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

主题外观管理 gulagala001/dsh-theme-plugin

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

DSH 主题与外观管理:图片市场、一键兼容安装、故障恢复和 AI 修复说明。Visual theme markets…

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 85 处,展示前 81 条)
  • 读取本地文件
    src/index.mjs:45
    res.writeHead(200, { 'Content-Type': MIME[extname(file)] || 'application/octet-stream', 'Cache-Control': 'public, max-age=86400', 'X-Content-Type-Opti
  • 读取本地文件
    src/index.mjs:54
    const bytes = await readFile(await ownedFile(theme.root, theme.client.path));
  • 读取本地文件
    src/index.mjs:64
    const file = await ownedFile(theme.root, name), bytes = await readFile(file);
  • 读取本地文件
    src/index.mjs:132
    for (const name of Object.keys(theme.files)) files[name] = await readFile(await ownedFile(theme.root, name));
  • 删除本地文件递归
    src/host/engine.mjs:196
    } finally { await rm(staging, { recursive: true, force: true }).catch(() => {}); }
  • 写入本地文件
    src/host/engine.mjs:208
    await mkdir(temporary, { recursive: true });
  • 读取本地文件
    src/host/engine.mjs:211
    const bytes = await readFile(await ownedFile(theme.root, name));
  • 写入本地文件
    src/host/engine.mjs:213
    const path = inside(temporary, name); await mkdir(dirname(path), { recursive: true }); await writeFile(path, bytes, { mode: 0o600 });
  • 写入本地文件
    src/host/engine.mjs:213
    const path = inside(temporary, name); await mkdir(dirname(path), { recursive: true }); await writeFile(path, bytes, { mode: 0o600 });
  • 写入本地文件
    src/host/engine.mjs:215
    await rename(temporary, target);
  • 删除本地文件递归
    src/host/engine.mjs:216
    } finally { await rm(temporary, { recursive: true, force: true }).catch(() => {}); }
  • 读取本地文件
    src/host/engine.mjs:218
    for (const [name, hash] of Object.entries(theme.files)) if (digest(await readFile(await ownedFile(target, name))) !== hash) throw new ThemeError('inst
  • 写入本地文件
    src/host/engine.mjs:232
    await mkdir(staging, { recursive: true });
  • 写入本地文件
    src/host/engine.mjs:234
    if (/ json$/i.test(name || '')) { const path = join(staging, 'theme.json'); await writeFile(path, bytes); list = [path]; }
  • 删除本地文件递归
    src/host/engine.mjs:244
    } finally { await rm(staging, { recursive: true, force: true }).catch(() => {}); }
  • 读取本地文件
    src/host/engine.mjs:276
    if (local && home && await exists(join(home, 'skins'))) for (const entry of await readdir(join(home, 'skins'), { withFileTypes: true })) if (entry.isD
  • 读取本地文件
    src/host/files.mjs:6
    export const exists = async path => { try { await stat(path); return true; } catch (e) { if (e.code === 'ENOENT') return false; throw e; } };
  • 读取本地文件
    src/host/files.mjs:8
    try { return JSON.parse(await readFile(path, 'utf8')); }
  • 写入本地文件
    src/host/files.mjs:12
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    src/host/files.mjs:14
    await writeFile(temp, JSON.stringify(value, null, 2) + '\n', { mode: 0o600 });
  • 写入本地文件
    src/host/files.mjs:15
    await rename(temp, path);
  • 读取本地文件
    src/host/files.mjs:24
    const base = await realpath(root), path = inside(base, name);
  • 读取本地文件
    src/host/files.mjs:25
    const real = await realpath(path);
  • 读取本地文件
    src/host/files.mjs:26
    if (inside(base, relative(base, real)) !== real || !((await stat(real)).isFile())) throw new ThemeError('resource-path', '资源不是主题目录内的文件');
  • 读取本地文件
    src/host/files.mjs:32
    for (const entry of await readdir(dir, { withFileTypes: true })) {
  • 写入本地文件
    src/host/store.mjs:9
    await mkdir(this.root, { recursive: true });
  • 写入本地文件
    src/host/packages.mjs:23
    await mkdir(folder, { recursive: true });
  • 写入本地文件
    src/host/packages.mjs:39
    await mkdir(dirname(path), { recursive: true }); await writeFile(path, data, { mode: 0o600 });
  • 写入本地文件
    src/host/packages.mjs:39
    await mkdir(dirname(path), { recursive: true }); await writeFile(path, data, { mode: 0o600 });
  • 读取本地文件
    src/host/packages.mjs:75
    const entries = await readdir(root, { withFileTypes: true });
  • 写入本地文件
    src/host/packages.mjs:112
    await mkdir(target, { recursive: true });
  • 写入本地文件
    src/host/packages.mjs:115
    const root = join(target, 'package'); await mkdir(root, { recursive: true });
  • 写入本地文件
    src/host/packages.mjs:128
    await mkdir(dirname(path), { recursive: true }); await writeFile(path, data.bytes);
  • 读取本地文件
    src/host/packages.mjs:171
    for (const entry of await readdir(folder, { withFileTypes: true })) {
  • 读取本地文件
    src/host/packages.mjs:186
    const root = await realpath(input); await walk(root);
  • 读取本地文件
    src/host/formats.mjs:49
    const file = (await stat(input)).isFile();
  • 读取本地文件
    src/host/formats.mjs:72
    const listed = file ? { files: [{ name: basename(input) }], bytes: (await stat(input)).size } : await walk(root);
  • 读取本地文件
    src/host/formats.mjs:74
    for (const item of listed.files) hashes[item.name] = digest(await readFile(join(root, item.name)));
  • 读取本地文件
    src/host/formats.mjs:78
    const contentHash = digest((file ? await readFile(input, 'utf8') : JSON.stringify(hashes)) + (prepared?.built ? digest(prepared.code) : '') +
  • 读取本地文件
    src/host/formats.mjs:83
    const full = await ownedFile(root, path), s = await stat(full);
  • 读取本地文件
    src/host/formats.mjs:85
    css.push(transformCss(await readFile(full, 'utf8'), { id, file: path, assets, resource, nativeTokens }));
  • 写入本地文件
    src/host/probe.mjs:15
    await mkdir(folder, { recursive: true });
  • 写入本地文件
    src/host/probe.mjs:17
    await writeFile(input, JSON.stringify({ theme, cli, folder, browserPath, plugin: resolve(import.meta.dirname, '../..'), screenshots }), { mode: 0o600
  • 执行外部命令来自配置/变量
    src/host/probe.mjs:22
    const child = spawn(process.execPath, [...(cli.includes('.asar/') ? ['--expose-internals'] : []), runner, input, result], { cwd: folder, env: { ...env
  • 删除本地文件递归
    src/host/probe.mjs:29
    await rm(join(folder, 'home'), { recursive: true, force: true }).catch(() => {});
  • 删除本地文件
    src/host/probe.mjs:30
    await rm(input, { force: true }).catch(() => {});
  • 读取本地文件
    src/host/native-backend.mjs:93
    if (digest(await readFile(await ownedFile(theme.root, name))) !== hash) throw new ThemeError('resource-changed', '主题文件在检查后发生变化,请重新安装');
  • 写入本地文件
    src/host/native-backend.mjs:96
    await mkdir(folder, { recursive: true });
  • 写入本地文件
    src/host/native-backend.mjs:98
    await writeFile(file, `import {createRequire as __dtpRequire} from "node:module";\nimport {fileURLToPath as __dtpFileUrlToPath} from "node:url";\n` +
  • 发起网络请求
    src/host/network.mjs:20
    const response = await fetch(target, { redirect: 'manual', signal: combined, headers: { 'User-Agent': 'dsh-theme-plugin/0.2', ...headers } });
  • 读取本地文件
    src/host/theme-backend.mjs:18
    collect(parse((await readFile(await ownedFile(root, path), 'utf8')).replace(/^ FEFF/, '')));
  • 读取本地文件
    src/host/browser.mjs:16
    for (const path of paths) { try { await access(path); return path; } catch {} }
  • 写入本地文件
    src/host/browser.mjs:20
    await mkdir(cache, { recursive: true });
  • 读取本地文件
    src/host/browser.mjs:25
    try { await access(path); return path; } catch {}
  • 读取本地文件
    src/host/browser.mjs:30
    await access(path);
  • 读取本地文件
    src/host/host-modules.mjs:14
    while (!existsSync(join(directory, 'package.json')) && dirname(directory) !== directory) directory = dirname(directory);
  • 读取本地文件
    src/host/host-modules.mjs:15
    const pkg = JSON.parse(readFileSync(join(directory, 'package.json'), 'utf8'));
  • 读取本地文件
    src/host/backend-build.mjs:13
    root = await realpath(root);
  • 读取本地文件
    src/host/backend-build.mjs:40
    let contents = await readFile(await ownedFile(root, path), 'utf8');
  • 读取本地文件
    src/host/build-dependencies.mjs:13
    const temporary = await realpath(await mkdtemp(join(tmpdir(), 'dsh-theme-dependencies-')));
  • 删除本地文件递归
    src/host/build-dependencies.mjs:17
    dispose: () => rm(temporary, { recursive: true, force: true }),
  • 读取本地文件
    src/host/build-dependencies.mjs:36
    const manifest = JSON.parse(await readFile(join(acquired.root, 'package.json'), 'utf8'));
  • 写入本地文件
    src/host/build-dependencies.mjs:42
    await mkdir(join(link, '..'), { recursive: true });
  • 发起网络请求
    src/client/external.mjs:162
    const response = await fetch(`${API}/probe-backend`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action
  • 发起网络请求
    src/client/store.mjs:61
    const response = await fetch(`${API}/${action}`, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body:
  • 发起网络请求
    src/client/theme-scope.mjs:125
    return window.fetch(url === request.url ? request : new Request(new URL(url, location.href), request), options);
  • 发起网络请求
    src/client/theme-scope.mjs:127
    return window.fetch(routeUrl(String(request)), options);
  • 发起网络请求
    src/client/theme-settings.mjs:15
    const response = await scope.fetch(`${API}/preferences`, { method: 'POST', headers: { 'Content-Type': 'application/json' },
  • 发起网络请求
    src/host/probe-page.mjs:12
    const url = route.request().url();
  • 发起网络请求
    src/host/probe-page.mjs:25
    if (response.request().resourceType() === 'font') warnings.push(`上游字体不可用,浏览器使用原主题声明的字体回退:${path}`);
  • 发起网络请求
    src/host/probe-page.mjs:59
    const health = await page.evaluate(async () => (await fetch('/', { cache: 'no-store' })).status);
  • 写入本地文件
    src/host/probe-page.mjs:69
    if (screenshots) { await mkdir(screenshots, { recursive: true }); await page.screenshot({ path: join(screenshots, `${error ? 'failed-' : ''}${state.st
  • 读取本地文件
    src/host/probe-runner.mjs:12
    const { theme, cli, folder, browserPath, plugin, screenshots } = JSON.parse(await readFile(input, 'utf8'));
  • 写入本地文件
    src/host/probe-runner.mjs:30
    await mkdir(join(profile, 'node_modules'), { recursive: true });
  • 读取本地文件
    src/host/probe-runner.mjs:31
    const { name: packageName } = JSON.parse(await readFile(join(plugin, 'package.json'), 'utf8'));
  • 写入本地文件
    src/host/probe-runner.mjs:33
    if (packageName.startsWith('@')) await mkdir(join(profile, 'node_modules', packageName.split('/')[0]), { recursive: true });
  • 写入本地文件
    src/host/probe-runner.mjs:35
    await writeFile(join(home, 'settings.yaml'), JSON.stringify({ locale: { preference: 'zh' }, 'ui-theme': { preference: 'light' } }));
  • 写入本地文件
    src/host/probe-runner.mjs:36
    const candidate = join(home, 'candidate.json'); await writeFile(candidate, JSON.stringify(theme), { mode: 0o600 });
  • 执行外部命令来自配置/变量
    src/host/probe-runner.mjs:41
    host = spawn(process.execPath, [...(cli.includes('.asar/') ? ['--expose-internals'] : []), cli, '--profile', 'theme-probe', '--no-open', '--port', '0'
  • 读取本地文件
    src/host/probe-runner.mjs:57
    for (const path of candidates.filter(Boolean)) { try { await access(path); executablePath = path; break; } catch {} }
  • 写入本地文件
    src/host/probe-runner.mjs:71
    await writeFile(output, JSON.stringify(result, null, 2), { mode: 0o600 });
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 主题与外观管理:图片市场、一键兼容安装、故障恢复和 AI 修复说明。DeepSeek Harness 的视觉主题市场与校验安装。

README

由 DeepSeek 最新模型翻译生成
dsh-theme-plugin 浏览社区主题,一键检查、安装和管理。DeepSeek Harness 插件 简体中文 · English 开始使用 · 完整文档 · 反馈 快速开始 适用环境: DSH 0.2.1-rc.3, Node.js 22.19+. 兼容以当前支持的 DSH 版本为基准,不为过老主题补旧接口。动态主题先在独立 DSH 与浏览器中运行检查;主题属于第三方插件,其后台使用真实宿主服务。预检不是恶意代码安全沙箱。 1. 安装 打开实际使用的 DSH 实例,在 插件 → + 添加插件 中粘贴: https://github.com/gulagala001/dsh-theme-plugin/releases/download/v0.2.6-dsh.0.2.1-rc.3/gulagala001-dsh-theme-plugin-0.2.6-dsh.0.2.1-rc.3.tgz 等当前任务结束后,按宿主提示启用或完整重启该实例,沿用原 profile 与数据。其他宿主、升级和卸载见安装指南 · SHA256SUMS. 2. 先试这一件事 打开 设置 → 外观 → 市场,选择一套主题,点击 安装并应用。 成功标志: 安装前检查通过后,当前外观切换,主题出现在“主题管理”;检查失败则保留原外观并显示具体原因。
展开完整文档(README 剩余 1 节)
dsh-theme-plugin

浏览社区主题,一键检查、安装和管理。DeepSeek Harness 插件

简体中文 · English

开始使用 · 完整文档 · 反馈

快速开始

适用环境: DSH 0.2.1-rc.3, Node.js 22.19+.

兼容以当前支持的 DSH 版本为基准,不为过老主题补旧接口。动态主题先在独立 DSH 与浏览器中运行检查;主题属于第三方插件,其后台使用真实宿主服务。预检不是恶意代码安全沙箱。

1. 安装

打开实际使用的 DSH 实例,在 插件 → + 添加插件 中粘贴:

https://github.com/gulagala001/dsh-theme-plugin/releases/download/v0.2.6-dsh.0.2.1-rc.3/gulagala001-dsh-theme-plugin-0.2.6-dsh.0.2.1-rc.3.tgz

等当前任务结束后,按宿主提示启用或完整重启该实例,沿用原 profile 与数据。其他宿主、升级和卸载见安装指南 · SHA256SUMS.

2. 先试这一件事

打开 设置 → 外观 → 市场,选择一套主题,点击 安装并应用。

成功标志: 安装前检查通过后,当前外观切换,主题出现在“主题管理”;检查失败则保留原外观并显示具体原因。

三个页面,管理完整外观

| 页面 | 可以做什么 |
| 外观设置 | 明暗、配色、背景、字体、尺寸、圆角、透明度、动态、Logo/标题及受支持的主题专属设置。 |
| 主题管理 | 查看内置、已有、导入与市场主题;启用、导出、移除和更新。 |
| 市场 | 多来源图片卡片、说明、作者、搜索、风格筛选、热门/最新排序与一键安装。 |

内置 DSH 原生、Glyph 动态字符、Codex Desktop、iOS Liquid Glass、Claude CLI 与 Google Material,并提供 29 套配色。新装保留原生外观;识别到已有主题或可迁移偏好时承接当前选择。默认标题为 DeepSeek Harness,保留主题的字体、造型和动态效果。

主题市场

已有主题直接纳入管理

已安装插件由 DSH 原生管理,主题基座协调启停,避免执行第二份主题。文件导入支持已识别的 .json、.zip 和 .tgz 格式;下载与适配保留上游原包。

主题管理

一次安装,先查版本和运行状态

市场旧快照先核对同包、同仓库的新版本,固定实际下载来源。源码型主题可自动准备客户端;后台使用当前 DSH 的真实服务和可释放生命周期。隔离检查覆盖加载、实际输入和设置入口、明暗、卸载与重挂载;失败时保留当前可用外观。

兼容声明与实际运行检查分开显示。未经检查的目录条目不标记为已兼容,依赖已移除旧接口的主题不会被强行装入。实际支持范围

常见问题

安装为什么需要等一会儿?

动态主题先进入暂存区,再启动匹配的独立 DSH 和浏览器检查。没有可用 Chromium/Chrome/Edge 时会准备固定浏览器资源,首次下载需要时间;失败不会跳过检查安装。

旧条目或有问题的主题怎么处理?

先自动查找同来源的可用新版。无法兼容时显示具体版本与原因,可复制完整 AI 修复任务;修复包重新导入后仍须通过检查。你不需要手写适配代码。AI 修复指南

升级 DSH 后还能继续使用吗?

只声明经过适配的宿主版本。宿主或兼容器变化后,受影响主题重新检查;原包和设置保留,未通过前恢复可用外观。不会通过放宽版本声明冒称支持未来 DSH。

数据、开发与许可

主题库位于 DSH_HOME/dsh-theme-plugin/,按 profile 区分;外观偏好和自定义背景还使用浏览器本地存储。主题后台作为原生插件使用其原有数据位置。市场浏览请求公开目录,安装请求 GitHub/npm/主题资源;主题管理本身不需要模型 Key,也不向市场上传会话。

隔离预检可发现常见启动故障,不能证明任意第三方代码、所有设备与延迟行为绝对安全。具体主题的功能和权限仍由原作者实现负责。

可选开发协议与构建。代码采用 MIT;字体、组件与其他来源见 THIRD_PARTY_NOTICES.md,第三方主题素材保持原许可。

文档与支持

| 我想做什么 | 去哪里 |
| 安装、升级、卸载 | 安装指南 |
| 了解使用方法与边界 | 使用文档 |
| 查看版本变化 | Releases |
| 反馈问题 | Issues |

反馈时请提供完整 DSH/插件版本、实际入口、最小复现步骤,以及预期和实际表现;日志与截图先移除私人数据。

返回顶部 · 版本与下载 · 反馈

文档结构与贡献
预览分享卡片长什么样 ↓gulagala001/dsh-theme-plugin
分享 · DeepSeek Harness Hub
gulagala001/dsh-theme-plugin

DSH 主题与外观管理:图片市场、一键兼容安装、故障恢复和 AI 修复说明。Visual theme markets…

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