Bundle
dsh-desktop-launcher
一个轻量的 dsh(DeepSeek Harness)插件:安装桌面双击启动器 —— macOS 上是带官方鲸鱼图标的 dsh.app,Linux 上是 .desktop 入口。零依赖,约 147 KB。(终端命令在独立的 dsh-launcher 包)
- Source
- LvienOeria
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 16 days ago
Readme
# dsh-desktop-launcher
[](https://www.npmjs.com/package/dsh-desktop-launcher) [](https://www.npmjs.com/package/dsh-desktop-launcher) [](https://github.com/LvienOeria/dsh-desktop-launcher/blob/main/LICENSE) [](https://github.com/LvienOeria/dsh-desktop-launcher)
[English](https://github.com/LvienOeria/dsh-desktop-launcher/blob/main/README.en.md) | **中文**
一个轻量的 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 插件:安装一个**桌面双击启动器** —— macOS 上是带官方黑色鲸鱼图标的 `dsh.app`,Linux 上是 `dsh.desktop` 入口。双击它,Web UI 启动并自动打开浏览器。Everything is a plugin,这个插件本身就是一个 bundle。
**轻量:** 零依赖,包体积约 147 KB(主要是两张 1024px 图标 PNG;macOS 的 `.icns` 用系统内置 `sips` + `iconutil` 现生成)。只碰桌面侧 —— 不装终端命令、不动 PATH。终端版是独立的 [dsh-launcher](https://github.com/LvienOeria/dsh-launcher) 包,想要什么装什么,绝不捆绑。
## 它能做什么
以 bundle 方式加载后,插件的 `apply` 会在每次 harness 启动时**收敛**以下产物(幂等:配置没变就是快速空操作):
| 产物 | 位置 | 说明 |
|---|---|---|
| 启动脚本 | `~/.dsh-launcher-desktop/dsh-start.command` | 启动 dsh → 轮询 Web UI 地址 → 就绪后自动打开浏览器 |
| macOS 应用 | `~/Desktop/dsh.app` | 双击即用,官方鲸鱼图标,在终端里运行启动器 |
| Linux 入口 | `~/.local/share/applications/dsh.desktop` | 应用菜单启动器(Terminal=true) |
| 图标 | 内置 `whale` / `whale-dark`(1024px PNG) | deepseek-harness 官方黑色鲸鱼 mark,白卡/深卡两种 |
## 安装
前置条件:`dsh` CLI + **pnpm ≥ 9**(harness 固定 pnpm 11 —— 版本旧的话执行 `corepack enable`)。
从 npm 安装:
```sh
dsh plugin --profile web add dsh-desktop-launcher
```
从 GitHub 安装 —— 纯 JS、**无构建步骤**,无需任何 allowlist:
```sh
dsh plugin --profile web add github:LvienOeria/dsh-desktop-launcher
```
本地路径安装也可以(零依赖):
```sh
dsh plugin --profile web add ./dsh-desktop-launcher
```
然后启动一次 dsh,插件会自动生成启动器:
```sh
dsh --profile web # 已安装 CLI
# 或
pnpm dsh web # 源码目录(自动检测)
```
搞定。双击桌面的 **dsh**;关闭它打开的终端窗口即停止 harness。
## 自定义
编辑 profile 的 patch 层(`~/.dsh/profiles/<profile>/cordis.patch.yml`)—— 后层覆盖前层,patch 会整体替换某行的 `config`:
```yaml
- id: dsh-desktop-launcher
config:
launcherName: dsh # 桌面应用/入口名称
iconStyle: whale-dark # whale | whale-dark
iconFile: '' # 自定义图标文件绝对路径(.icns/.png)
url: http://127.0.0.1:3080 # Web UI 地址(轮询 + 打开)
sourceDir: /path/to/deepseek-harness # 从源码目录执行 `pnpm dsh web`
startCommand: '' # 完全自定义启动命令(单行)
autoOpenBrowser: true
```
### 自定义图标
把任意 `.icns`(macOS)或 `.png`(Linux)放到任意位置,用 `iconFile` 指向它;macOS 上给 `.png` 会自动转成 `.icns`。内置的 `whale` / `whale-dark` 是官方 mark 的白卡/深卡版本;用 `python3 scripts/build-icons.py /path/to/deepseek-harness/apps/web/public/favicon.svg` 可从官方 favicon 重新生成(需要 Pillow + macOS 的 `sips`)。
### 启动命令的解析顺序
1. `startCommand`(显式指定)
2. `sourceDir` → `cd <目录> && pnpm dsh web`
3. 当前目录是带 `dsh` script 的源码检出
4. PATH 上已安装的 `dsh` CLI(防递归:绝不解析到我们自己的 wrapper)
5. 回退 `dsh --profile web`(带警告)
## 安全性设计
- 每个生成文件都带 `# managed by dsh-desktop-launcher vX` 标记;**没有**该标记的已有文件或应用会被先备份为 `<path>.bak` 再替换(绝不静默覆盖)。
- 配置未变 → 不重写任何文件(状态哈希存在 `~/.dsh-launcher-desktop/state.json`)。
- 非法配置(未知 `iconStyle`、`iconFile` 不存在、`url` 非 http(s)、`startCommand` 含换行)会响亮失败并给出清晰报错。
- 安装失败只打日志,绝不会拖垮 harness —— dsh 照常启动。
## 卸载
```sh
dsh plugin --profile web remove dsh-desktop-launcher
rm -rf ~/.dsh-launcher-desktop ~/Desktop/dsh.app
# Linux 上还有: ~/.local/share/applications/dsh.desktop
```
## 说明
- macOS 首次启动可能询问是否打开生成的应用 —— 那是 Gatekeeper,点「打开」即可。
- 鲸鱼 mark 来自 [deepseek-harness](https://github.com/deepseek-ai/deepseek-harness)(`apps/web/public/favicon.svg`),此处仅用作启动器图标。
- 想要终端命令而不是 / 或者同时要桌面应用?安装 [dsh-launcher](https://github.com/LvienOeria/dsh-launcher)。
- 不支持 Windows(不会安装任何文件,只打一条警告)。
## License
MIT —— 见 [LICENSE](LICENSE)。
Install
dsh plugin --profile web add github:LvienOeria/dsh-desktop-launcher
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-desktop-launcher from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.