# dsh-web-ui

> DSH Web GUI Skill Center panel: browse skills by source tier, enable/disable model calls, create and soft delete (move to .trash).

## Metadata

- Author: [@zhu1090093659](https://github.com/zhu1090093659)
- Repo: <https://github.com/zhu1090093659/dsh-web-ui.git>
- GitHub: [zhu1090093659/dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui)
- Stars: 5,127
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Homepage: <https://gallery.dsh-market.com>
- Topics: `deepseek-harness`, `dsh`, `dsh-plugin`, `web-ui`
- Forks: 311
- Open Issues: 49
- Last push: 2026-08-20T14:37:38.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-skill-explorer
```

## Wiki

## 一句话定位
dsh-web-ui 是一套 DSH Web GUI 插件与皮肤全家桶，本条目收录的子包 dsh-skill-explorer 为 Web GUI 提供「技能中心」面板：按来源分级浏览已加载的全部 skill，启用/禁用模型调用，创建新技能，并把删除改为可恢复的回收站操作。

## 核心能力
- 按来源分组浏览 skill（系统内置、项目 `.dsh/skills`、项目 `.agents/skills`、自定义目录、用户 `~/.dsh/skills`、用户 `~/.agents/skills`、运行时注册）
- 在面板中启用或禁用单个 skill 的模型调用，通过改写 SKILL.md frontmatter 中的 `disable-model-invocation` 字段触发官方目录热刷新
- 通过表单创建新 skill，可选择写入用户级目录（本机所有项目共享）或项目级目录（仅当前项目）
- 删除 skill 时把 SKILL.md 移入同级 `.trash` 目录而非永久删除，便于误操作后恢复
- 提供 `/api/dsh-skill-explorer/health` 健康检查接口，便于宿主或自动化校验插件状态
- 跟随符号链接扫描，可识别项目仓库内通过链接挂载的 skill（标记为「软链接」）

## 技术实现
- **语言**: TypeScript
- **关键依赖**: `@deepseek-ai/cordis`（cordis 插件框架）、`@deepseek-ai/dsh-host-webserver`（host 半区路由挂载）、`@deepseek-ai/dsh-client-runtime` + `@deepseek-ai/dsh-client-locale`（浏览器半区注入）、`react@^18.2.0`
- **架构模式**: cordis 插件，host/client 双半区——host 半区在 dsh 进程内挂载 5 个 `/api/dsh-skill-explorer/*` 路由并读取 `ctx.skills`/`ctx.sessions`，client 半区通过 MutationObserver 把侧边栏入口注入原生 DOM，并用 React overlay 渲染技能中心面板
- **入口文件**: `src/index.ts`（host）、`src/client/index.ts`（browser）

## 适用场景
DSH 用户已经积累了大量 skill 散落在多个目录（系统内置、项目根、用户根、自定义目录），手动管理困难；通过本插件可以在一个面板里集中查看、快速启用/禁用模型调用、按需创建或清理 skill，避免编辑 SKILL.md 文件出错。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 0.1.0-rc.8+ | 依赖 `@deepseek-ai/dsh-client-runtime` / `@deepseek-ai/dsh-host-webserver` / `@deepseek-ai/dsh-client-locale` ^0.1.0-rc.8（package.json:39-58） |
| Node.js | ^22.19 \|\| >=24 | packages/AGENTS.md:9 全局约定 |
| 平台 | 跨平台 | 仅使用 node:fs / node:os / node:http 等标准库，无原生依赖 |
| 原生模块 | 无 | bundle 纯 JS |

## 安装方式
```bash
dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-skill-explorer
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `enabled` | 布尔 | 插件总开关；设为 `false` 时所有路由不再注册 | `true`（未禁用即生效） |
| `customSkillDirs` | 字符串数组 | 额外的自定义 skill 根目录，扫描后会作为「自定义目录」分组列出 | `[]` |
| `dshHome` | 字符串 | 用户级 DSH 配置根目录覆盖；用于定位 `~/.dsh/skills` | `$DSH_HOME` 环境变量，否则 `~/.dsh` |
| `agentsHome` | 字符串 | 用户级 agents 配置根目录覆盖；用于定位 `~/.agents/skills` | `$DSH_AGENTS_HOME` 环境变量，否则 `~/.agents` |

## 常见问题

**Q: 安装后侧边栏没有出现「技能中心」入口怎么办？**

A: 需要重启 `dsh web`。bundle 注入在 DSH 启动阶段完成，运行时热加载不会重新渲染侧边栏；重启后入口会出现在「New Session」按钮与工作区浏览器之间。

**Q: 为什么系统内置或运行时注册的 skill 没有启用/禁用开关和删除按钮？**

A: 这两类 skill 来自 `ctx.skills` 注册表，没有可编辑的文件。插件只信任文件系统扫描产出的路径（src/routes.ts:165-169），所以面板上隐藏这些控件，对应的写路由收到请求也会返回 404。

**Q: 删除按钮不见了，这个 skill 不能删吗？**

A: 是的。通过符号链接挂载进来的 skill 不能删除——删除会把链接目标的 SKILL.md 移出原位，越出当前 skill 根（src/collect.ts:144-154）。面板会隐藏删除按钮，delete 路由收到请求也会以 400 拒绝。启用/禁用对这类 skill 仍然有效。

**Q: 在手机或局域网其他设备上访问 DSH 时，技能中心能用吗？**

A: 默认不能。所有路由只接受 loopback 请求或浏览器同源标记，未配对的局域网客户端会先收到 `403 forbidden: loopback-only`。如果同时安装了 dsh-remote-web-ui 并完成设备配对，配对设备的 cookie 是额外放行路径（src/access.ts:28-34）。

**Q: 创建的 skill 立即生效吗？**

A: 是的。官方 dsh-skill-filesystem 提供方会热扫描新文件，模型目录即时刷新，无需重启 DSH。注意新 skill 的内容会被作为指令注入模型上下文，请避免写入敏感信息（src/client/locales.ts:52）。

**Q: 项目级 skill 和用户级 skill 有什么区别？**

A: 项目级 skill（写入项目根目录下的 `.dsh/skills/`）仅当前项目可见，便于跟代码一起版本管理；用户级 skill（写入 `~/.dsh/skills/`）本机所有项目共享，适合存放跨项目的通用指令。面板创建表单允许在这两个位置之间二选一。

**Q: 创建 skill 时内容大小有限制吗？**

A: 有。表单提交时正文内容（不含 frontmatter）超过 64KB 会被服务端拒绝，提示 `content exceeds 64KB limit`（src/routes.ts:217-220）。

## 上手难度
入门 — 装好即用，无需阅读任何源码；想理解 frontmatter 改写或符号链接边界行为时再翻 README 安全模型与限制章节。

## 已知问题与限制
- 项目级 skill 跟随面板显示的 workspace：list 路由支持 `?cwd=` 显式覆盖，项目根取该目录最近的 `.git` 祖先；如果工作区不在 git 仓库内，则项目级 skill 无法定位
- frontmatter 解析为轻量零依赖实现，支持块标量、布尔、嵌套 `input` 块；不支持的生僻 YAML 特性以官方 dsh-skill-filesystem 提供方的解析为准，技能中心展示可能与官方解析存在差异
- 链接型 skill（符号链接）不可删除（详见常见问题）；启用/禁用对链接 skill 正常，会改写目标自身 SKILL.md 的 frontmatter
- 单文件符号链接（指向单个 `.md`）在原子改写时会被替换为一个普通文件，符号链接本身不再保留，链接目标文件不受影响（README.md:96-100）
- bundled 与 runtime 来源的 skill 在面板中列出但不暴露编辑控件（无 path），不能启用/禁用也不能删除

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-web-ui](https://deepseek-plugin.org/plugins/zhu1090093659/dsh-web-ui/packages/dsh-skill-explorer)
Wiki generated by AI (model: `MiniMax-M3`)
