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

角色皮肤桌面端 SkyNotSilent/deepseek-harness-desktop-gala

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

双击启动桌面端,为对话换上角色皮肤与语气

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

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

展开查看检查明细 ↓

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

✗npm 包deepseek-harness-desktop-gala(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 01:13:17

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 108 处,展示前 104 条)
  • 读取本地文件
    dsh-plugin-desktop/src/bin.ts:35
    const manifest = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { version?: unknown }
  • 执行外部命令来自配置/变量
    dsh-plugin-desktop/src/bin.ts:47
    const child = spawn(electronPath, [mainPath], { stdio: 'inherit', env: process.env })
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-fault-log.ts:46
    mkdirSync(path, { mode: 0o700, recursive: true })
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-fault-log.ts:50
    return statSync(path).size
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-fault-log.ts:56
    appendFileSync(path, value, { encoding: 'utf8', mode: 0o600 })
  • 删除本地文件
    dsh-plugin-desktop/src/desktop-fault-log.ts:59
    rmSync(next, { force: true })
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-fault-log.ts:60
    renameSync(previous, next)
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:127
    return lstatSync(filename)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:136
    mkdirSync(directory, { recursive: true, mode: DIRECTORY_MODE })
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:137
    const stat = lstatSync(directory)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:141
    chmodSync(directory, DIRECTORY_MODE)
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:146
    const unexpected = readdirSync(directory).filter(entry => !allowed.includes(entry))
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:158
    for (const entry of readdirSync(directory)) {
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:163
    const stat = lstatSync(filename)
  • 删除本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:167
    unlinkSync(filename)
  • 删除本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:174
    unlinkSync(filename)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:188
    writeFileSync(temporary, contents, { encoding: 'utf8', flag: 'wx', mode })
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:189
    chmodSync(temporary, mode)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:190
    renameSync(temporary, filename)
  • 删除本地文件递归
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:429
    rmSync(cacheDir, { force: true, recursive: true })
  • 删除本地文件递归
    dsh-plugin-desktop/src/desktop-runtime-environment.ts:433
    rmSync(cacheDir, { force: true, recursive: true })
  • 删除本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:187
    unlinkSync(filename)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:197
    writeFileSync(temporary, contents, { encoding: 'utf8', flag: 'wx', mode })
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:198
    chmodSync(temporary, mode)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:199
    renameSync(temporary, filename)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:207
    mkdirSync(stateDir, { recursive: true, mode: STATE_DIRECTORY_MODE })
  • 读取本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:208
    const stat = lstatSync(stateDir)
  • 写入本地文件
    dsh-plugin-desktop/src/desktop-terminal.ts:212
    chmodSync(stateDir, STATE_DIRECTORY_MODE)
  • 读取本地文件
    dsh-plugin-desktop/src/electron-runtime.ts:81
    const value: unknown = JSON.parse(readFileSync(new URL('../package.json', moduleUrl), 'utf8'))
  • 发起网络请求
    dsh-plugin-desktop/src/electron-runtime.ts:128
    request: (url, init) => net.fetch(url, init),
  • 发起网络请求
    dsh-plugin-desktop/src/electron-runtime.ts:615
    const response = await window.webContents.session.fetch(authenticationUrl, {
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:87
    mkdirSync(dirname(filename), { recursive: true, mode: 0o700 })
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:89
    writeFileSync(temporary, contents, { encoding: 'utf8', flag: 'wx', mode: 0o600 })
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:90
    renameSync(temporary, filename)
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:94
    const value: unknown = JSON.parse(readFileSync(filename, 'utf8'))
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:191
    if (!existsSync(statePath)) return defaultState()
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:192
    const parsed: unknown = JSON.parse(readFileSync(statePath, 'utf8'))
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:216
    mkdirSync(seedDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:223
    if (existsSync(patch)) copyFileSync(patch, join(seedDir, 'cordis.patch.yml'))
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:223
    if (existsSync(patch)) copyFileSync(patch, join(seedDir, 'cordis.patch.yml'))
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:224
    const sourceSettings = existsSync(join(options.currentProfileDir, 'settings.yaml'))
  • 读取本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:227
    if (existsSync(sourceSettings)) {
  • 写入本地文件
    dsh-plugin-desktop/src/gala-workspaces.ts:319
    mkdirSync(profileDir, { recursive: true, mode: 0o700 })
  • 读取本地文件
    dsh-plugin-desktop/src/gui-path.ts:32
    return readFileSync(path, 'utf8')
  • 读取本地文件
    dsh-plugin-desktop/src/gui-path.ts:39
    return readdirSync(path, { withFileTypes: true })
  • 读取本地文件
    dsh-plugin-desktop/src/gui-path.ts:49
    return statSync(path).isDirectory()
  • 发起网络请求
    dsh-plugin-desktop/src/main.ts:242
    await shutdown.request(0)
  • 发起网络请求
    dsh-plugin-desktop/src/main.ts:265
    const requestQuit = (code: number): void => { void shutdown.request(code) }
  • 发起网络请求
    dsh-plugin-desktop/src/main.ts:477
    await shutdown.request(exitCode)
  • 读取本地文件
    dsh-plugin-desktop/src/profile-manager.ts:182
    for (const entry of readdirSync(profilesDir, { withFileTypes: true })) {
  • 读取本地文件
    dsh-plugin-desktop/src/profile-manager.ts:190
    if (!existsSync(join(dir, PROFILE_MANIFEST_FILENAME))) continue
  • 读取本地文件
    dsh-plugin-desktop/src/profile-manager.ts:254
    return readFileSync(descriptor, 'utf8')
  • 读取本地文件
    dsh-plugin-desktop/src/profile-manager.ts:264
    if (lstatSync(statePath).isSymbolicLink()) {
  • 删除本地文件
    dsh-plugin-desktop/src/profile-manager.ts:287
    unlinkSync(filename)
  • 写入本地文件
    dsh-plugin-desktop/src/profile-manager.ts:296
    mkdirSync(stateDir, { recursive: true, mode: STATE_DIRECTORY_MODE })
  • 读取本地文件
    dsh-plugin-desktop/src/profile-manager.ts:297
    const directoryStat = lstatSync(stateDir)
  • 写入本地文件
    dsh-plugin-desktop/src/profile-manager.ts:301
    chmodSync(stateDir, STATE_DIRECTORY_MODE)
  • 写入本地文件
    dsh-plugin-desktop/src/profile-manager.ts:304
    writeFileSync(temporary, `${JSON.stringify(state, undefined, 2)}\n`, {
  • 写入本地文件
    dsh-plugin-desktop/src/profile-manager.ts:309
    chmodSync(temporary, STATE_FILE_MODE)
  • 写入本地文件
    dsh-plugin-desktop/src/profile-manager.ts:310
    renameSync(temporary, statePath)
  • 读取本地文件
    dsh-plugin-desktop/src/profile.ts:100
    text = readFileSync(spec.filename, 'utf8')
  • 读取本地文件
    dsh-plugin-desktop/src/profile.ts:184
    if (!existsSync(join(dir, 'package.json'))) {
  • 写入本地文件
    dsh-plugin-desktop/src/profile.ts:318
    writeFileSync(rootConfig, '[]\n')
  • 读取本地文件
    dsh-plugin-desktop/src/splash.ts:65
    artDataUrl = `data:${mime};base64,${readFileSync(appearance.artPath).toString('base64')}`
  • 发起网络请求
    dsh-plugin-desktop/src/update-checker.ts:144
    return globalThis.fetch(url, init)
  • 读取本地文件
    dsh-plugin-desktop/src/windows-volume-diagnostics.ts:31
    while (!existsSync(current)) {
  • 读取本地文件
    dsh-plugin-gala/src/gala-collection.ts:64
    raw = readFileSync(filePath, 'utf8')
  • 写入本地文件
    dsh-plugin-gala/src/gala-collection.ts:85
    mkdirSync(dirname(filePath), { recursive: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-collection.ts:91
    writeFileSync(tmp, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 写入本地文件
    dsh-plugin-gala/src/gala-collection.ts:92
    renameSync(tmp, filePath)
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:235
    if (existsSync(manifestPath)) {
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:237
    const parsed: unknown = JSON.parse(readFileSync(manifestPath, 'utf8'))
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:289
    return readFileSync(join(activeSkinDir, cssPath), 'utf8')
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:366
    if (existsSync(officialDir)) return officialDir
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:374
    if (root !== undefined && avatar !== '' && existsSync(join(root, avatar))) {
  • 读取本地文件
    dsh-plugin-gala/src/gala-host.ts:384
    if (root === undefined || relativePath === '' || !existsSync(join(root, relativePath))) return null
  • 读取本地文件
    dsh-plugin-gala/src/gala-http.ts:169
    if (!existsSync(absolute) || !statSync(absolute).isFile()) return finish(res, 404)
  • 读取本地文件
    dsh-plugin-gala/src/gala-http.ts:169
    if (!existsSync(absolute) || !statSync(absolute).isFile()) return finish(res, 404)
  • 读取本地文件
    dsh-plugin-gala/src/gala-http.ts:173
    createReadStream(absolute).pipe(res)
  • 读取本地文件
    dsh-plugin-gala/src/gala-market.ts:199
    names = readdirSync(marketDir)
  • 读取本地文件
    dsh-plugin-gala/src/gala-market.ts:210
    parsed = JSON.parse(readFileSync(join(dir, GALA_ENTRY), 'utf8'))
  • 读取本地文件
    dsh-plugin-gala/src/gala-market.ts:247
    if (existsSync(targetDir)) {
  • 读取本地文件
    dsh-plugin-gala/src/gala-market.ts:256
    if (existsSync(targetDir)) {
  • 写入本地文件
    dsh-plugin-gala/src/gala-market.ts:267
    mkdirSync(marketDir, { recursive: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-market.ts:272
    mkdirSync(dirname(destination), { recursive: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-market.ts:273
    writeFileSync(
  • 删除本地文件递归
    dsh-plugin-gala/src/gala-market.ts:280
    if (conflict === 'overwrite') rmSync(targetDir, { recursive: true, force: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-market.ts:281
    renameSync(tempDir, targetDir)
  • 删除本地文件递归
    dsh-plugin-gala/src/gala-market.ts:283
    rmSync(tempDir, { recursive: true, force: true })
  • 删除本地文件递归
    dsh-plugin-gala/src/gala-market.ts:293
    rmSync(targetDir, { recursive: true, force: true })
  • 读取本地文件
    dsh-plugin-gala/src/gala-persona.ts:38
    const parsed: unknown = JSON.parse(readFileSync(filePath, 'utf8'))
  • 写入本地文件
    dsh-plugin-gala/src/gala-persona.ts:50
    mkdirSync(dirname(filePath), { recursive: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-persona.ts:53
    writeFileSync(tmp, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 写入本地文件
    dsh-plugin-gala/src/gala-persona.ts:54
    renameSync(tmp, filePath)
  • 读取本地文件
    dsh-plugin-gala/src/gala-skin.ts:58
    raw = readFileSync(filePath, 'utf8')
  • 写入本地文件
    dsh-plugin-gala/src/gala-skin.ts:80
    mkdirSync(dirname(filePath), { recursive: true })
  • 写入本地文件
    dsh-plugin-gala/src/gala-skin.ts:84
    writeFileSync(tmp, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 写入本地文件
    dsh-plugin-gala/src/gala-skin.ts:85
    renameSync(tmp, filePath)
  • 读取本地文件
    dsh-plugin-gala/src/gala-splash.ts:61
    parsed = JSON.parse(readFileSync(filename, 'utf8'))
  • 读取本地文件
    dsh-plugin-gala/src/gala-splash.ts:82
    entries = readdirSync(marketDir, { withFileTypes: true })
  • 读取本地文件
    dsh-plugin-gala/src/gala-splash.ts:93
    parsed = JSON.parse(readFileSync(join(dir, GALA_ENTRY), 'utf8'))
  • 读取本地文件
    dsh-plugin-gala/src/gala-splash.ts:107
    return existsSync(avatar) ? avatar : undefined
  • 写入本地文件
    dsh-plugin-gala/src/ggal-pack.ts:145
    writeFileSync(path, buildZip(ggalEntries(input), method))
  • 读取本地文件
    dsh-plugin-gala/src/ggal-zip.ts:106
    const buffer = readFileSync(ggalPath)
扫描于 2026/11/6(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 双击启动桌面端
  • 角色皮肤与语气
  • 可选人格

DeepSeek Harness 桌面应用,支持 macOS 和 Windows——零配置,Gala 角色皮肤,可选人格,多模态聊天,兼容插件。

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Desktop Gala 中文 · English 把 DeepSeek Harness 装进桌面,再给它一个角色。 一个开箱即用的 DeepSeek Harness(DSH)桌面端,内置 Gala 角色皮肤系统:「GALA·群星」默认登场,十位角色可独立换装,整片舞台背景始终相随。 📥 下载页面 · GitHub Releases 如果这个项目让 DSH 更好用,欢迎点一个 ⭐ Star 关注后续更新。 这是什么 DeepSeek Harness 是一个"万物皆插件"的 Agent 运行时,官方提供命令行与 Web 界面。DeepSeek Harness Desktop Gala 把同一个运行时封装成 macOS / Windows 应用:双击启动、系统托盘常驻、内置终端、自动检查更新——并在此之上做了一件官方没做的事:让界面有角色。 首次启动从开屏开始就由十位 Gala 角色与鲸鱼共同组成的「GALA·群星」登场;以后开屏会跟随上次成功使用的角色或外观。选中单独角色后,侧边栏头像、欢迎页标题、整片对话舞台背景和界面配色会一起换装。「GALA·群星」是图鉴里的正式默认 IP;「恢复原装」则会清除 Gala 人物、背景、品牌与配色。三套经典配色保持纯净、无人物的界面。角色是贯穿使用过程的陪伴,不只是换个主题色。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop Gala

中文 · English

把 DeepSeek Harness 装进桌面,再给它一个角色。
一个开箱即用的 DeepSeek Harness(DSH)桌面端,内置 Gala 角色皮肤系统:「GALA·群星」默认登场,十位角色可独立换装,整片舞台背景始终相随。

📥 下载页面 · GitHub Releases

如果这个项目让 DSH 更好用,欢迎点一个 ⭐ Star 关注后续更新。

这是什么

DeepSeek Harness 是一个"万物皆插件"的 Agent 运行时,官方提供命令行与 Web 界面。DeepSeek Harness Desktop Gala 把同一个运行时封装成 macOS / Windows 应用:双击启动、系统托盘常驻、内置终端、自动检查更新——并在此之上做了一件官方没做的事:让界面有角色。

首次启动从开屏开始就由十位 Gala 角色与鲸鱼共同组成的「GALA·群星」登场;以后开屏会跟随上次成功使用的角色或外观。选中单独角色后,侧边栏头像、欢迎页标题、整片对话舞台背景和界面配色会一起换装。「GALA·群星」是图鉴里的正式默认 IP;「恢复原装」则会清除 Gala 人物、背景、品牌与配色。三套经典配色保持纯净、无人物的界面。角色是贯穿使用过程的陪伴,不只是换个主题色。

本项目是社区作品,不是 DeepSeek 官方产品。完全开源免费;如有人向你出售此软件,请拒绝。

功能

| 🎀 Gala 角色皮肤 | 默认由十位角色与鲸鱼共同登场;也可切换阿基、小窗、阿念、灵灵、盾盾、敲敲、巧巧、忆忆、令令或宝宝。每套都有专属配色、头像、舞台立绘与寄语;支持导入 .ggal 角色包、收藏与合成。 |
| 💬 个性化人物 | 十位官方角色各自带人物设定(傲娇天才阿念、御姐大姐姐阿基、粘人管理员忆忆、星海巫女灵灵……)。开启后,换上谁的皮肤,模型就用谁的语气回答;代码、命令与事实不受影响。默认关闭,可在设置或换肤弹层一键开启;全员群星、经典配色与原装始终不带人物语气。 |
| 🪐 角色独立空间 | 默认关闭;开启前会先展示它做什么、什么仍共享、要付出的代价与风险,确认后才生效。开启后,全体、官方角色和自定义角色可拥有独立 Profile、非敏感设置与插件编队。切换角色会先校验目标空间,再保存状态并有序重启;凭据、聊天与工作目录继续共享。 |
| 🖼️ 多模态对话 | 跟随 DeepSeek Harness 0.1.2(运行时固定为 0.1.2-alpha.2),支持图片输入与 DeepSeek-V4 Flash Vision。 |
| 🖥️ 零配置本地 Host | 安装包自带 Electron、Node 与固定版本的 DSH 运行时;首次启动自动准备默认 profile,无需安装 Node.js 或 pnpm。 |
| 🧩 插件生态兼容 | 继续使用官方 dsh plugin 语义管理插件;兼容模式保留上游 Web 客户端,高级模式提供桌面自有布局与窗口材质。 |
| 🧰 托盘、终端、profile | 托盘一键打开带好环境变量的终端;多 profile 切换;关闭窗口不退出。 |
| 🔄 安全的更新策略 | 后台检查 GitHub Releases;Preview 只提示不下载,签名正式版下载与安装前各确认一次。 |

安装

从 下载页面 获取对应系统的安装包:
- macOS(Apple Silicon):DeepSeek-Harness-Desktop-Gala--arm64.dmg,拖入"应用程序"。
- Windows x64:DeepSeek-Harness-Desktop-Gala--x64-Setup.exe,按向导安装。

首次启动的系统提示

- macOS Preview 使用 Developer ID 签名并通过 Apple 公证,拖入「应用程序」后可正常打开;当前只支持 Apple Silicon。
- Windows Preview 尚未做 Authenticode 签名;SmartScreen 弹窗中点击「更多信息 → 仍要运行」。

每个 Release 都附带 SHA256SUMS.txt 供校验。

配置 API Key

第一次发送消息前,在 设置 → 模型 填入 DeepSeek API Key。密钥保存在本机 ~/.dsh/.credentials.yaml,不会进入仓库或安装包。账户余额不足时,界面会直接提示并给出充值入口。

使用 Gala

- 侧边栏底部 🎀 Gala皮肤图鉴 打开换装面板。图鉴第一张「GALA·群星」回到十位角色与鲸鱼共同登场的群星皮肤;「恢复原装」清除全部 Gala 外观。三套经典配色仍可单独选择。
- 设置 → 插件 → 角色空间 可开启“角色独立空间(硬核)”(开启前有完整说明与确认)、查看当前外观/工作台、开关“个性化人物”(默认关闭,换肤弹层里也有同一开关)并查看当前角色的人物设定,还能批量调整当前角色的插件编队。系统必需插件会锁定;安装与升级继续在 DSH Terminal 完成。
- 托盘菜单提供 嘎啦图鉴 / 换肤面板 / 合成工坊 / 导入嘎啦包;快捷键 Cmd/Ctrl + Shift + S 直达换肤面板。
- 角色数据与皮肤协议见 dsh-plugin-gala/。

更多说明见 用户指南。

从源码运行

需要 Node.js 22.19+ 与 Corepack(Yarn 4)。

git clone https://github.com/SkyNotSilent/deepseek-harness-desktop-gala.git
cd deepseek-harness-desktop-gala
corepack yarn install --immutable
corepack yarn dev

corepack yarn check 运行构建、类型检查、全部测试与打包闭包校验;corepack yarn package:dir 生成本机未签名应用。角色空间状态模型见 docs/role-workspaces.md,架构、插件接口与发布流程见 docs/。

仓库结构

dsh-plugin-desktop/ Electron 壳:窗口、托盘、profile、终端、更新、打包 dsh-plugin-gala/ Gala 角色系统:角色库、皮肤、图鉴面板、.ggal 包、品牌座位 site/ 下载站(GitHub Pages) docs/ 用户指南、架构、插件开发、发布流程 .github/workflows/ CI、Preview 发布、签名发布、站点部署

致谢

- DeepSeek Harness 提供了 Agent、模型、工具、会话与 Web UI 的全部核心能力。
- Cordis 提供了让"桌面本身也是插件"成立的插件框架。

许可

MIT License。
预览分享卡片长什么样 ↓SkyNotSilent/deepseek-harness-desktop-gala
分享 · DeepSeek Harness Hub
SkyNotSilent/deepseek-harness-desktop-gala

双击启动桌面端,为对话换上角色皮肤与语气

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