dsh-plugin-wukong-cli 0.25.1 → 0.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,69 +1,51 @@
1
1
  # Wukong
2
2
 
3
- > **面向 DeepSeek Harness 的社区插件 / 管理中枢** — 提示词、技能、MCP 工具服务器、全局壁纸与特效,一站式管理面板。
3
+ > **面向 DeepSeek Harness 的插件 / 管理中枢** — 提示词、技能、MCP 工具服务器、生图、全局壁纸与特效,一站式管理面板。
4
4
 
5
- **插件包 / 安装器**:插件包 `dsh-plugin-wukong` · 安装器包 `dsh-plugin-wukong-cli`(命令 `wukong`) · [GitHub](https://github.com/agassiz/dsh-plugin-wukong)
5
+ **插件包 / 安装器**:插件包 `dsh-plugin-wukong` · 安装器包 `dsh-plugin-wukong-cli`(命令 `wukong`)
6
6
 
7
- **中文** · [**English**](./README.en.md)
7
+ ![Wukong:壁纸、毛玻璃与管理面板(深色)](https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/hero-dark.jpg)
8
8
 
9
- ![Wukong:壁纸、毛玻璃与管理面板(深色)](docs/preview/hero-dark.jpg)
10
-
11
- | <img src="docs/preview/hero-light.jpg" width="190"/> | <img src="docs/preview/prompts.png" width="190"/> | <img src="docs/preview/skills.png" width="190"/> | <img src="docs/preview/mcp.png" width="190"/> | <img src="docs/preview/wallpaper.png" width="190"/> |
9
+ | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/hero-light.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/prompts.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/skills.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/mcp.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/wallpaper.jpg" width="190"/> |
12
10
  |--|--|--|--|--|
13
11
  | 浅色主题 | 提示词 | 技能 | MCP | 壁纸 |
14
12
 
15
- ![version](https://img.shields.io/badge/version-0.25.1-00ff9c)
16
- ![license](https://img.shields.io/badge/license-MIT-blue)
13
+ | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/imagegen.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/stats.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/archive.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/enhance.jpg" width="190"/> | <img src="https://cdn.jsdelivr.net/npm/dsh-plugin-wukong-assets@1.1.0/preview/edit-resend.jpg" width="190"/> |
14
+ |--|--|--|--|--|
15
+ | 生图 | 统计 | 归档管理 | 提示词增强 | 编辑重发 |
16
+
17
+ ![version](https://img.shields.io/badge/version-0.26.2-00ff9c)
17
18
  ![platform](https://img.shields.io/badge/platform-web%20%2B%20desktop-00ff9c)
18
19
  ![runtime](https://img.shields.io/badge/runtime-DSH%200.2.0--rc.2-8957e5)
19
- ![CI](https://github.com/agassiz/dsh-plugin-wukong/actions/workflows/ci.yml/badge.svg)
20
-
21
- ```
22
- ✦ Wukong v0.21.0
23
- ┌─────────┬─────────┬─────┬────────────┬──────┬──────┐
24
- │ 提示词 │ 技能 │ MCP │ Wallpaper │ 对话 │ 统计 │
25
- │ 作用域注入 │ 合并管理 │ 连接 │ 壁纸·特效 │ 导入 │ 用量 │
26
- └─────────┴─────────┴─────┴────────────┴──────┴──────┘
27
- ```
28
20
 
29
21
  ---
30
22
 
31
23
  ## 📑 目录
32
24
 
25
+ - [🎯 适用环境](#-适用环境)
33
26
  - [🚀 快速开始](#-快速开始)
34
- - [🎯 适配目标 · Supported upstreams](#-适配目标--supported-upstreams)
35
27
  - [✨ 功能](#-功能)
36
28
  - [🖼️ 生图(generate_image)](#️-生图generate_image)
37
- - [🗄️ 状态与数据](#️-状态与数据)
29
+ - [🛒 扩展市场(MCP 与技能)](#-扩展市场mcp-与技能)
38
30
  - [⌨️ 斜杠命令](#️-斜杠命令)
39
- - [🖥️ 平台支持](#️-平台支持)
31
+ - [🧰 在聊天中使用技能](#-在聊天中使用技能)
32
+ - [🗄️ 数据存放位置](#️-数据存放位置)
40
33
  - [🔄 一键更新](#-一键更新)
41
34
  - [🗑️ 卸载](#️-卸载)
42
- - [🧰 在聊天中使用技能](#-在聊天中使用技能)
43
- - [🏗️ 架构](#️-架构)
44
- - [📦 包含的包](#-包含的包)
45
- - [🗂️ 仓库结构](#️-仓库结构)
46
- - [🛠️ 开发](#️-开发)
47
35
  - [❓ FAQ](#-faq)
48
- - [📚 文档](#-文档)
49
- - [🤝 贡献 / 官方合入](#-贡献--官方合入)
50
- - [📄 许可](#-许可)
51
- - [🔗 友情链接 · Friends](#-友情链接--friends)
52
36
 
53
37
  ---
54
38
 
55
- ## 🎯 适配目标 · Supported upstreams
39
+ ## 🎯 适用环境
56
40
 
57
- Wukong 是 **DeepSeek Harness 的插件**,按下列官方运行时的 **0.2.0-rc.2 内部接口世代**移植与测试:
41
+ Wukong 是 **DeepSeek Harness 的插件**,基于官方 **0.2.0-rc.2** 版本开发与测试:
58
42
 
59
- | 上游 | 对应环境 | 仓库 |
43
+ | 环境 | 面板 | `/wukong-skill-dir` 命令 |
60
44
  |---|---|---|
61
- | **DeepSeek Harness** | `dsh web` 网页端运行时 | <https://github.com/deepseek-ai/deepseek-harness> |
62
- | **DSH Desktop** | 桌面客户端 | <https://github.com/anywhere-labs/dsh-desktop> |
45
+ | `dsh web` 网页端([deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness)) | ✅ | ✅ |
46
+ | DeepSeek Harness 官方桌面客户端 | ✅ | ✅ |
63
47
 
64
- > ⚠️ **要求 DSH 0.2.0-rc.2(或同一接口世代的构建)。** 0.12.0 已把插件移植到当前世代:harness 的 settings 服务改成了「每个 loader 条目一个命名空间」(`SettingsForms`),旧的 `settingsNamespace` / `settingsScope` 接口**在该世代已不存在**。因此**面向旧 2.0.9 世代的构建(0.11.x 及更早)不再受支持**,本插件也**有意不提供向后兼容**——两代接口只能二选一。0.13.0 在此基础上完成了打包与安装的标准化:原来的两个包(`@deepseek-ai/dsh-switchblade` + `@deepseek-ai/dsh-client-ui-switchblade`)合并为一个可发布的插件包 `dsh-switchblade`;0.14.0 项目更名为 **Wukong**,插件包随之改名、目录改为 `packages/wukong/`;0.15.0 把安装器从插件包里拆了出来,两个包自此各自命名;**0.21.0 统一改名为插件包 `dsh-plugin-wukong` 与安装器包 `dsh-plugin-wukong-cli`(bin 仍是 `wukong`),插件自身数据目录仍为 `$DSH_HOME/wukong/`。**
65
- >
66
- > ⚠️ **请使用上述官方仓库的构建(或其保持兼容的派生版)。** 其他 fork / 魔改版本的内部接口可能不同,导致面板无法挂载、状态不生效、命令缺失,甚至让客户端进入恢复模式——那不是本插件的 bug。安装或反馈前请先确认你的运行时来自以上两个出处。
48
+ > ⚠️ **仅支持 DeepSeek Harness 官方发布的 0.2.0-rc.2 版本**(`dsh web` 与官方桌面客户端)。
67
49
 
68
50
  ---
69
51
 
@@ -71,97 +53,74 @@ Wukong 是 **DeepSeek Harness 的插件**,按下列官方运行时的 **0.2.0-
71
53
 
72
54
  ### 安装
73
55
 
74
- **两个包,名字不同**:跑的是安装器 **`dsh-plugin-wukong-cli`**(bin 为 `wukong`),它装的是插件包 **`dsh-plugin-wukong`**。拆开这两个名字的原因很简单:`pnpm add dsh-plugin-wukong`(或在 harness 插件管理器里选 `dsh-plugin-wukong`)本来就是标准路径,安装器命令与 bundle 分开叫,才不会互相抢名字。
75
-
76
- **从仓库里直接跑**(把当前工作副本装进 profile 时,用 `--spec` 指定本地路径):
56
+ 需要先装好 DeepSeek Harness 运行时(`dsh web` 或桌面客户端)和 **pnpm**。然后运行安装器:
77
57
 
78
58
  ```bash
79
- node cli.cjs --profile web --spec link:<仓库>/packages/wukong # 只装 web profile,装的是工作副本
80
- node cli.cjs # 装到全部 profile(默认装 npm 上已发布的 dsh-plugin-wukong@<同版本>)
59
+ npx dsh-plugin-wukong-cli
81
60
  ```
82
61
 
83
- **安装器发布到 npm 之后**:
62
+ 或者全局安装后用命令 `wukong`:
84
63
 
85
64
  ```bash
86
- npx dsh-plugin-wukong-cli # 无需 checkout;npx 只解析包名,所以这里必须写包名 dsh-plugin-wukong-cli
87
- npm i -g dsh-plugin-wukong-cli # 或全局安装,再使用 bin 名
88
- wukong # 全局安装后的命令名(bin)
65
+ npm i -g dsh-plugin-wukong-cli
66
+ wukong
89
67
  ```
90
68
 
91
- > ⚠️ 别把两个名字混起来:`dsh-plugin-wukong` 是**插件包**、没有 bin,要跑安装器请用 `npx dsh-plugin-wukong-cli`(或先 `npm i -g dsh-plugin-wukong-cli` 再直接跑 `wukong`)。`wukong` 是 bin 名而不是包名,**不能交给 npx 直接调用**(npx 会把 `wukong` 当成另一个包去 npm 上找)。改名前的 `prompt-skill-armory` 停在 **0.11.0**——那是旧 2.0.9 世代、对当前运行时已经坏了的版本,已不再使用。
92
-
93
- ```bash
94
- node cli.cjs -h # 只打印用法并退出,不装任何东西(--help 同义)
95
- node cli.cjs -v # 只打印安装器与插件版本并退出,不装任何东西(--version 同义)
96
- ```
97
-
98
- 安装器走的是 harness 的**标准插件安装路径**:
99
-
100
- 1. 在 profile 目录里执行 `pnpm add <spec>`:默认 spec 是 npm 上已发布的 `dsh-plugin-wukong@<安装器版本>`,`--spec <spec>` 可换成任何普通 pnpm 来源(npm 包名、本地路径、tarball、git 地址),装上后 `dsh-plugin-wukong` 就是 profile 的正式依赖
101
- 2. 把 `dsh-plugin-wukong` 追加到 profile 的 `dsh.profile.bundles`
102
- 3. 清理更早版本留下的安装痕迹:旧 bundle/依赖名 `dsh-switchblade` 与 `@deepseek-ai/dsh-switchblade`、`node_modules/@deepseek-ai/` 下 `dsh-switchblade` 与 `dsh-client-ui-switchblade` 两份拷贝式安装、profile `cordis.patch.yml` 里手写的 `ui-switchblade` 行(只删这一条,其余行——空行也算——逐字节保留,因为那份文件 DSH.app 也在写),以及旧的 `$DSH_HOME/{switchblade,wallpapers,armory-exports}` 数据目录。`dsh-plugin-wukong` 这个依赖名**不用清也不能清**:它就是现在的插件包名
103
- 4. 体检 `settings.yaml` 体积(防 4MB 膨胀)——插件本身不写该文件
104
-
105
- 安装器需要 **pnpm**:profile 安装本质就是一条 pnpm 依赖,找不到 pnpm 时安装器直接报错退出,不会退化成别的装法。
106
-
107
- 因为 `dsh-plugin-wukong` 是一条带 bundle patch 的**真实 profile 依赖**,harness 插件管理器会把它列入:侧栏**插件**页和**设置 → 插件**的「已安装」里都能看到、能开关。面板本身仍在 **设置 → Wukong**(书图标)。
69
+ > ⚠️ **两个包,名字不同**:要运行的是安装器 **`dsh-plugin-wukong-cli`**(命令 `wukong`),它装的是插件包 **`dsh-plugin-wukong`**。`dsh-plugin-wukong` 没有命令可运行;`wukong` 是命令名而不是包名,不能写成 `npx wukong`。
108
70
 
109
71
  常用参数:
110
72
 
111
73
  ```bash
112
- node cli.cjs --profile web # 只装 web profile
113
- node cli.cjs --profile web,desktop # 指定多个(可重复、逗号分隔,-p 为简写)
114
- node cli.cjs --spec dsh-plugin-wukong@0.21.0 # 指定来源:npm 包名 / 本地路径 / tarball / git 地址
115
- node cli.cjs --spec link:/abs/path/to/packages/wukong --profile web # 把工作副本装进 profile
116
- node cli.cjs -h # 只打印用法并退出(--help 同义)
117
- node cli.cjs -v # 只打印安装器与插件版本并退出(--version 同义)
118
- node cli.cjs uninstall --profile web # 只从 web 卸载
74
+ npx dsh-plugin-wukong-cli --profile web # 只装到 web profile
75
+ npx dsh-plugin-wukong-cli --profile web,desktop # 指定多个(可重复、逗号分隔,-p 为简写)
76
+ npx dsh-plugin-wukong-cli --spec <来源> # 指定来源:npm 包名 / 本地路径 / tarball / git 地址
77
+ npx dsh-plugin-wukong-cli -h # 只打印用法,不安装任何东西
78
+ npx dsh-plugin-wukong-cli -v # 只打印安装器与插件版本
119
79
  ```
120
80
 
121
- `--profile` 可重复、可逗号分隔;**不带该参数时才会装到全部 profile**。选中的标准 profile 不存在时会按标准配置创建;名字写错会直接报错并列出当前可用的 profile。
122
-
123
- `--spec` 是唯一的来源覆盖:给了它就用它,不给就用默认的已发布包 `dsh-plugin-wukong@<安装器版本>`。本地路径、tarball、git 地址都是普通 pnpm spec,装法与 npm 包名完全一样。`--postinstall` 是 npm 钩子,本身不装任何东西。
81
+ - **不带 `--profile` 时会装到全部 profile**;名字写错会直接报错并列出可用的 profile。
82
+ - 安装器走的是 harness 的标准插件安装方式:在 profile 里 `pnpm add dsh-plugin-wukong`,并把它加入 profile 的 bundle 列表;同时清理更早版本留下的旧安装。找不到 pnpm 时会直接报错退出。
83
+ - 装好后,插件会出现在侧栏 **插件** 页和 **设置 → 插件** 的「已安装」里,可以开关。
124
84
 
125
85
  ### 启动
126
86
 
127
87
  ```bash
128
- dsh web # 或直接重启 DSH Desktop 客户端
88
+ dsh web # 或重启 DeepSeek Harness 桌面客户端
129
89
  ```
130
90
 
131
- 打开 **设置 → Wukong**(书图标)。
132
-
133
- > **要求**:已安装 DeepSeek Harness 运行时(0.2.0-rc.2 世代;`dsh web` 或桌面客户端)。插件是 DSH 的插件,不打包运行时本身——同时也**不需要 deepseek-harness 源码 checkout**:插件包带的是 esbuild 预构建产物(`lib/` + `client/`)。
91
+ 打开 **设置 → Wukong** 即可使用。
134
92
 
135
93
  ---
136
94
 
137
95
  ## ✨ 功能
138
96
 
139
- - **提示词(可作用域)** — 增删改查、启用/停用、设默认。作用域五选一:**全局**(默认)/ **仅指定项目**(按会话工作区目录名匹配)/ **仅指定会话** / **除指定项目外** / **除指定会话外**。启用后经 `ctx.systemPrompt.section` 注入:作用域内的提示词**只对匹配的 agent 返回正文**,不匹配的 section 返回空串、由渲染阶段直接丢弃——因此不会泄漏到其他项目或会话。提示词正文以**关闭插值**(`interpolate: false`)的 section 注册,正文里字面写的 `{{cwd}}`(或任何 `{{...}}`)会**原样送到模型**,不会被当成模板 token;否则渲染阶段会因插值失败而让每个启用该提示词的会话每一步都失败。
140
- - **技能(合并管理)** — 一个列表:面板安装的(编辑/开关/卸载)+ 本地扫描的(托管),带调用提示 `/name`。
141
- - **技能安装方式**
142
- - 手动填写
143
- - `.md` 文件选择
144
- - 面板导入 `.zip` 技能包(上传到 `$DSH_HOME/skills`)
145
- - 会话内命令:`/wukong-skill-dir <dir>`(目录式,浏览器读不到主机目录,只能在这里装)
146
- - **MCP 工具服务器** — 添加/编辑/移除 stdio 或 HTTP 的 MCP 服务器,启用即自动连接,每台展示运行状态与工具列表,支持「测试」连接。
147
- - **Wallpaper(全局壁纸与特效)** — 五张随包附带的**原创内置风景**(点一下即应用)、本地上传图片/视频或填图片 URL;壁纸的主题 token 通过官方 `ctx.theme.overrideTokens` 合成一层覆盖,切换亮/暗主题自动跟随;透明度/遮罩/玻璃/模糊/铺法实时可调;**web 与桌面客户端分别设置**。上传的字节存盘,状态文档里只留 id,永远不会把二进制写进配置。
148
- - **生图(`generate_image`)** — 给会话注册一个生图工具:模型按提示词调用 OpenAI 兼容的 Images API,图存进工作区;Provider 与模型在面板「生图」页从宿主模型目录里选,端点与密钥跟着 Provider 走;对话里生成时显示占位动效。详见下一节 [🖼️ 生图](#️-生图generate_image)。
149
- - **初始化模型** — 提示词页「提示词增强」上面:输入 provider 名(默认 `cpa`),一键给它下面所有模型声明图片输入(多模态)并统一思考等级(`off→none, low, medium, high, xhigh, max`),provider 的 `defaultInput` 也设成 `[text, image]`,以后新加的模型默认就带图片能力。改的是**当前运行的那个 profile** 的 `cordis.patch.yml`(按启动参数认出来,认不出就报错,不碰别的 profile;注释与其他条目原样保留),改前备份、只留最近三份,live 重载无需重启;点完在按钮下面显示改了哪个环境、哪个文件、改了什么,已经是目标配置时提示无需改动。与 DSH.app「工具 → 初始化 cpa 模型」是同一套规则。
150
- - **输入栏提示行样式** — 为 composer 下方提示与统计行单独设启用/颜色/字号/渐变色。
151
- - **对话导入 / 导出** — 勾选多个会话导出为 zip(含附件与工作区),另一台机器导入即可还原;列表显示对话标题、项目、时间与占用大小;支持**真实删除**(删目录 + 清索引;仍在运行的会话会被拒绝),导入经会话持久化服务流式写盘。导出的 zip 存在 `$DSH_HOME/wukong/exports/`,且每次导出后自动清理:保留最新 10 个,并删除超过 7 天的归档。
152
- - **使用统计(cc-switch 风格)** — 时间范围筛选(全部/30天/7天/今天);输入/输出/缓存读/缓存写 Token、缓存命中率、成本估算;请求日志(时间/项目/输入输出/缓存/成本/用时/首字/状态);Provider(项目)统计与模型统计;SVG 双轴趋势图(今天按 24 小时分段)。统计与会话列表都通过 harness 的 session-query 服务读取(项目目录编码与持久化后端保持一致),缓存命中率与首字时间取自真实用量数据。
153
- - **单个状态文档** — 全部托管状态写在一个私有 JSON 文档里(见下节),**原子写入**(临时文件 + rename),不会挤占 harness 的 settings 文档。
154
- - **标准插件打包** — 一个包 `dsh-plugin-wukong` 同时声明 Host bundle patch 与浏览器面板(`dsh.bundle.patch` + `dsh.client`),安装后出现在侧栏**插件**页与**设置 → 插件**的「已安装」列表,可被插件管理器开关。
155
- - **中英双语 UI**(简体中文 / English)。
156
- - **设置侧边栏书图标**。
97
+ - **提示词(可设作用域)** — 增删改查、启用 / 停用、设默认。作用域五选一:**全局**(默认)/ **仅指定项目** / **仅指定会话** / **除指定项目外** / **除指定会话外**;不匹配的项目和会话完全不会收到这条提示词。正文原样发给模型,里面写的 `{{...}}` 不会被当成模板变量。
98
+ - **提示词增强** — 输入框右侧的增强按钮用模型改写你写好的草稿,只替换输入框内容,不发送消息、也不写入会话;默认跟随当前对话的模型,也可在提示词页固定用某个 Provider 与模型(比如更便宜的小模型)。
99
+ - **编辑重发与分叉** — 已发出的消息下方多了「编辑」和「分叉」两个按钮:编辑后发送,会从这条消息之前分出一个新会话继续,原会话移入回收站(可在归档管理里恢复);「分叉」只从这条消息之前分出新会话并跳过去,不发送也不动原会话。
100
+ - **归档管理**(设置 → 归档管理)— 按工作区查看已归档 / 未归档的会话,可批量归档、取消归档、移入回收站;回收站里的会话可以恢复或永久删除。只有「永久删除 / 清空回收站」才会真正删除数据,且都会先确认。
101
+ - **初始化模型** — 提示词页里输入 provider 名(默认 `cpa`),一键给它下面所有模型声明图片输入(多模态)并统一思考等级(`off→none, low, medium, high, xhigh, max`),以后新加的模型默认也带图片能力。只改**当前运行的那个环境**,改前自动备份(保留最近三份),无需重启;按钮下方会显示改了哪个环境、哪个文件、改了什么。
102
+ - **技能(合并管理)** — 一个列表同时显示面板安装的技能(可编辑、开关、卸载)和本地扫描到的技能,带调用提示 `/name`。安装方式:手动填写、选择 `.md` 文件、导入 `.zip` 技能包、扩展市场、会话内命令 `/wukong-skill-dir <目录>`。
103
+ - **MCP 工具服务器** — 添加 / 编辑 / 移除 stdio 或 HTTP(S) 服务器,启用即自动连接;每台显示运行状态与工具列表,支持一键测试连接。
104
+ - **生图与改图** — 选好 Provider 与模型后,助手就能按提示词生成图片、修改已有图片;对话里点开图片可以标注、评论、擦除、移除背景、调整大小。详见 [🖼️ 生图](#️-生图generate_image)。
105
+ - **壁纸与毛玻璃** — 五张随包附带的原创风景(点一下即应用),也可以上传图片 / 视频或填图片 URL。
106
+ - 壁纸只透进主界面(侧栏、对话区、右侧栏、底部栏);菜单、弹窗保持原本的不透明底色。
107
+ - 可实时调节:图片透明度、遮罩(可开「自动遮罩」,按壁纸亮度自动调整)、面板透明度、**浮层透明度**(吸顶标题栏、窄窗口下叠在对话上的右侧栏、设置对话框、「已编辑文件」卡片、提问卡片等毛玻璃的不透明度,默认 50)、玻璃模糊、壁纸模糊、填充方式。
108
+ - 开着壁纸时,次要文字(说明、时间、未选中的标签等)会自动加深一档,避免在壁纸上看不清。
109
+ - 跟随浅色 / 深色主题;**网页端与桌面客户端分别设置**。
110
+ - **输入栏提示行样式** — 为输入框下方的提示与统计行单独设置启用 / 颜色 / 字号 / 渐变色。
111
+ - **对话导入 / 导出** — 勾选多个会话导出为 zip(含附件与工作区),在另一台机器导入即可还原;支持真实删除会话(仍在运行的会话会被拒绝)。导出文件自动清理:保留最新 10 个,并删除超过 7 天的。
112
+ - **使用统计** — 按全部 / 30 天 / 7 天 / 今天筛选;输入 / 输出 / 缓存读写 Token、缓存命中率、成本估算;请求日志、按项目与模型的统计、趋势图。
113
+ - **中英双语界面**(简体中文 / English)。
157
114
 
158
115
  ---
159
116
 
160
117
  ## 🖼️ 生图(generate_image)
161
118
 
162
- 插件会给会话注册一个 **`generate_image`** 工具:模型按文字提示词调用一次 OpenAI 兼容的 Images API,图片存进会话工作区。工具挂在 harness 的 `tools` 服务上而不是 web 路由上,所以 headless profile 也能用;对话里的占位动效只在 web 面板里有。
119
+ **使用**:设置 → Wukong → **生图**,选好 Provider 与模型(与输入框的模型选择器是同一份目录),按需调整默认尺寸、质量、格式与保存目录,保存;然后直接对助手说「生成一张……」。
163
120
 
164
- **使用**:设置 → Wukong → **生图**,选好 Provider 与模型(目录与提示词增强、输入框模型选择器是同一份),按需调默认尺寸 / 质量 / 格式与保存目录,保存;然后直接对助手说「生成一张……」。**不预置任何模型名**:Provider 与模型没选全时,**助手的工具列表里根本没有 `generate_image`**(保存后立即出现,清除后立即消失,不用重启);万一仍被调用也会明确报错(`imagegen-unset`),不会替你猜一个模型发出去。设置按次读取,面板里换了模型下一次调用就生效。
121
+ - **不预置任何模型**:没选好 Provider 与模型之前,助手根本看不到生图工具;保存后立即可用,清除后立即消失,不用重启。
122
+ - **端点与密钥**跟着 Provider 走,使用宿主里该 Provider 的配置,不会另存一份。请求的是 OpenAI 兼容的 `POST {baseURL}/images/generations`。
123
+ - **保存位置**只由面板里的「保存目录」决定(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径);同名文件不会被覆盖,会自动加 `-2`、`-3`。
165
124
 
166
125
  **工具参数**(除 `prompt` 外都可省略,省略时用面板里的默认值):
167
126
 
@@ -170,86 +129,44 @@ dsh web # 或直接重启 DSH Desktop 客户端
170
129
  | `prompt` | 必填,描述图片的文字 |
171
130
  | `size` | `auto` / `1024x1024` / `1024x1536` / `1536x1024` / `2048x2048` / `2048x1152` / `3840x2160` / `2160x3840` |
172
131
  | `quality` | `low` / `medium` / `high` / `auto` |
173
- | `output_format` | `png` / `jpeg` / `webp`,同时决定落盘扩展名(`jpeg` 写成 `.jpg`) |
174
- | `file_name` | 文件名(只要名字,不要目录;扩展名跟着输出格式)。保存目录**只由面板里的「保存目录」决定**(默认 `output/imagegen`,相对当前会话项目,也可填绝对路径),模型改不了;传了目录或 `../` 只会取最后一段名字。同名文件不会被覆盖,自动加 `-2`、`-3`。缺省为 `<提示词slug>-<时间戳>` |
175
-
176
- **端点与凭据**:不存进插件状态,跟着 Provider 走、调用时按次解析——从宿主 settings 里该 Provider 配置的 `baseURL` 与 `apiKeyEnv` 取,密钥经宿主 `credentials` 服务解析(`apiKeyEnv` 为空表示端点不要密钥)。请求是 `POST {baseURL}/images/generations`,body 为 `model` / `prompt` / `size` / `quality` / `output_format`;响应认 `b64_json`,或 `url`(会再下载一次)。一次调用出一张图;单次超时默认 5 分钟。
132
+ | `output_format` | `png` / `jpeg` / `webp`,同时决定扩展名(`jpeg` 存成 `.jpg`) |
133
+ | `file_name` | 文件名(只要名字,不含目录);缺省为 `<提示词>-<时间戳>` |
177
134
 
178
- **对话里怎么显示**:插件在 `tool.call.toolview` 里按工具名 `generate_image` 注册了自己的视图,替换宿主默认的工具卡片。
179
- - 调用进行中(模型写参数时、等 API 时):一块与成图同比例的骨架占位,点阵加一道很淡的扫光(浅色 / 深色主题都可见;系统开了「减少动态效果」时不动)。
180
- - 成功后:占位收成一行「Generated … at <路径>」。**图本身由助手在回复里用 Markdown 嵌入**——工具说明里要求了这一点,所以同一张图不会在工具卡片和回复里各出现一次。这依赖模型照做;模型没嵌图时,图仍在磁盘上,路径就在那一行文字里。
181
- - 失败时:一行安静的错误文字。
182
-
183
- **改图(`edit_image`)**:选好 Provider 与模型后,除了 `generate_image`,模型还会多一个 `edit_image`:把项目里已有的一张图(`image`,必须在项目或保存目录之内)连同提示词、可选蒙版(`mask`,PNG,透明处是允许改的地方)发给 `POST {baseURL}/images/edits`,结果存进保存目录,名字是原图名加 `-edited`,**不覆盖**原图。几条约束照 Codex `imagegen` 技能里记的 Image API:不发 `input_fidelity`、不发 `background`(`gpt-image-2` 都不接受),蒙版只是提示性的、不保证精确形状,输入图与蒙版各小于 50MB。
184
-
185
- **图片查看器**:工具结果那一行有缩略图和「编辑图片」,点开是全屏查看器,图上叠一层画布,底部一排工具(交互照 Codex):
186
-
187
- | 工具 | 做什么 | 怎么落到改图 |
188
- |---|---|---|
189
- | 标注 | 点开后底部工具栏换成:选择(点选 / 拖动 / Delete 删除)、画笔、文字、形状(直线、箭头、矩形、椭圆、三角形、菱形、五角星、爱心)、颜色(13 个预设色,第一格彩虹点开是自定义取色:明暗方块、色相条、浏览器支持时有取色器、RGB / HEX / HSL 数值框)、橡皮(像素橡皮:一点一点擦掉自己画的,鼠标处有范围圈,大小跟粗细滑块;整条删除用「选择」+ Delete)、撤销 / 重做、退出,最左边的手柄可以把工具栏拖到别处;左边一根竖向滑块调粗细和字号。标注是矢量对象,不是画在位图上的像素 | 带标记的图 + 文字标注的内容 + 说明发给助手,由它调用 `edit_image` |
190
- | 添加评论 | 拖出一个区域写意见,带编号 | 同上,并把框出的区域做成蒙版,让模型只改框里 |
191
- | 擦除 | 用画笔涂出要擦的内容 | 面板直接带蒙版让 Host 改图,不经过模型 |
192
- | 移除背景 | 点击后先确认(它会调用图片模型、产生一次费用) | 先请模型直接输出透明背景,返回的图本身已带透明区域就原样采用;否则让模型把主体放到纯绿 `#00ff00` 底上,再在浏览器里把绿色抠成透明(`gpt-image-2` 不返回真 alpha,做法同 Codex 的 `remove_chroma_key.py`),存成 `-cutout.png` |
193
- | 调整大小 | 输入宽高(可锁定比例) | 浏览器里直接缩放,存成 `-<宽>x<高>.png`,不调用模型 |
135
+ **对话里的显示**:生成中显示与成图同比例的占位动画;完成后工具卡片收成一行文字,带缩略图和「编辑图片」按钮;大图由助手嵌入到回复里。
194
136
 
195
- 所有结果都存在原图旁边、不覆盖旧文件,可以用「上一版」退回。「发送给助手」会在**当前会话**里发一条新消息:缩小到长边 1536 以内的标注图作为图片、原图与蒙版的路径和每条意见作为文字;模型按 `wukong-imagegen` 技能的说明处理(原图当 `image`、不保留红色标记)。限制:没有明确主体的图(比如整个房间)模型常常不会换成绿底,这时会提示失败并告诉你边缘实际的颜色;抠色对「主体里有大片绿色」的图不友好(叶子、草会被部分抠掉);`gpt-image-2` 的蒙版不保证像素级精确。
137
+ **改图(`edit_image`)**:选好模型后,助手还能修改项目里已有的图片(可带蒙版,只改指定区域),结果另存为 `<原名>-edited`,不覆盖原图。
196
138
 
197
- **技能(`wukong-imagegen`)**:两个工具注册的同时,插件会注入一个只给模型用的技能,写明怎么写图片提示词、编辑时「只改 X、保留 Y」、收到标注图怎么办、透明背景怎么做、尺寸与质量怎么选。内容改写自 OpenAI Codex 的 `imagegen` 技能(Apache-2.0)。工具没注册(没选好模型)时它也不注入,不占上下文。
139
+ **图片查看器**:点缩略图或「编辑图片」打开全屏查看器:
198
140
 
199
- **错误码**(`code` 是稳定的机器键,面板与工具据此选文案):`imagegen-unset`(没选 Provider / 模型)· `imagegen-route`(Provider 在当前部署里解析不出端点或凭据)· `imagegen-prompt`(提示词为空)· `imagegen-http`(非 2xx)· `imagegen-network` · `imagegen-timeout` · `imagegen-aborted` · `imagegen-format`(响应不是 JSON)· `imagegen-empty`(响应里没有图)· `imagegen-download`(`url` 下载失败)· `imagegen-image`(要改的图读不到 / 太大 / 不是 PNG、JPEG、WebP)· `imagegen-path`(图在项目与保存目录之外)。
200
-
201
- > 设置里的 `size` / `quality` 等偏好缺失或非法时回落到默认值;只有 Provider 与模型必须由你选。**更新插件后需要重启 dsh**(工具的注册 / 卸载挂在 tools 服务上,随设置变化自动进行);只改面板视图的样式时刷新页面即可。
202
-
203
- ---
204
-
205
- ## 🗄️ 状态与数据
206
-
207
- 0.12.0 起,Wukong 不再使用 harness 的 settings 命名空间:全部托管状态放在插件自己的文档与目录里。
208
-
209
- | 路径 | 内容 |
141
+ | 工具 | 做什么 |
210
142
  |---|---|
211
- | `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、托管技能、自定义命令、MCP 服务器、壁纸/特效设置(壁纸只存 id)、生图设置(Provider / 模型 / 默认尺寸等;端点与密钥不存这里) |
212
- | `$DSH_HOME/wukong/wallpapers/` | 上传的壁纸 / 视频字节 |
213
- | `$DSH_HOME/skills/` | zip / 目录方式安装的技能(官方 filesystem 技能 provider 扫描并监听该根目录) |
214
- | `$DSH_HOME/wukong/exports/` | 对话导出 zip |
143
+ | 标注 | 画笔、文字、形状(直线、箭头、矩形、椭圆、三角形、菱形、五角星、爱心)、颜色、橡皮、撤销 / 重做;画好后「发送给助手」,由助手按标注改图 |
144
+ | 添加评论 | 框出区域写意见(带编号),框出的区域作为蒙版,只改框内 |
145
+ | 擦除 | 涂抹要去掉的内容,直接改图 |
146
+ | 移除背景 | 抠出透明背景,存成 `-cutout.png`(会调用一次图片模型,点击前先确认) |
147
+ | 调整大小 | 输入宽高(可锁定比例),存成 `-<宽>x<高>.png`,不调用模型 |
215
148
 
216
- 面板与 Host 之间只走插件自己的**同源 HTTP 路由**(旧的 `api.settings.mutate/describe` 与 `ctx.settingsScope` 路径已全部移除):
149
+ 所有结果都存在原图旁边、不覆盖旧文件,可以用「上一版」退回。
217
150
 
218
- | 路由 | 用途 |
219
- |---|---|
220
- | `GET` / `POST /api/wukong/state` | 读写状态文档(面板的增删改查都走这里):读返回 `{ok, revision, state}`;写收 `{state, ifRevision}`,每次写入都会归一化文档并让 `revision` 加一 |
221
- | `GET /api/wukong/skills` | 面板要的技能 + 托管命令目录:`{ok, revision, skills, commands}`,不必再从整份状态文档里重建 |
222
- | `GET /api/wukong/models` | 提示词增强可固定的模型列表:宿主模型选择器用的同一份目录(`sessionController.modelCatalog()`),按提供商分组;宿主没有该服务时回 503,面板退回手填 |
223
- | `GET /api/wukong/imagegen/file?path=` · `POST /api/wukong/imagegen/edit` · `POST /api/wukong/imagegen/save` | 图片查看器用:读一张图给 `<img>` 显示 / 不经过模型直接改图(擦除、移除背景,`persist:false` 时不落盘)/ 把面板算出的图(缩放、抠色、蒙版)另存在原图旁边。只认绝对路径下按魔数判定的 PNG / JPEG / WebP,结果一律不覆盖旧文件 |
224
- | `POST /api/wukong/mcp/test` | 一次性 MCP 连接测试 |
225
- | `GET /api/wukong/market` · `POST /api/wukong/market/install` | 扩展市场:按 `kind=mcp\|skill` 与 `q` 搜索聚合目录(官方 MCP Registry、DSH MCP Market、ClawHub、SkillsMP + 随包精选),安装时只接受显式条目 id;MCP 需要环境变量时以禁用状态装好并返回 `needsEnv` |
226
- | `POST /api/wukong/skills/zip` | 上传 zip 技能包并解压到 `$DSH_HOME/skills` |
227
- | `POST /api/wukong-wallpaper/upload` · `GET /api/wukong-wallpaper/image/<id>` | 壁纸上传(流式写盘,上限 60MB)/ 回读(流式,支持 `Range`) |
228
- | `GET /api/wukong-wallpaper/preset/<id>.jpg` · `<id>-thumb.jpg` | 随包附带的五张内置风景及缩略图(`dawn-peaks` / `misty-forest` / `desert-dusk` / `night-coast` / `alpine-lake`) |
229
- | `GET /api/wukong/version` | 版本检查:`{ok, latest, current}`(`current` 运行时读自插件 `package.json`,`latest` 是 npm 上的最新发布版,取不到时为空串) |
230
- | `GET /api/wukong/stats` · `/sessions`,`POST /api/wukong/export` · `/import` · `/delete` · `/update` | 统计、会话列表、导出/导入/删除、一键更新(更新走 `dsh-plugin-wukong-cli`,需显式确认) |
151
+ > 更新插件后需要**重启 dsh**,生图工具才会按新版本注册;只是面板样式变化时刷新页面即可。
231
152
 
232
- 写入的乐观并发约定:`ifRevision` 与当前 `revision` 不符时,`POST /api/wukong/state` 返回 **HTTP 409** 与 `{ok:false, error:'stale', revision, state}`,调用方应当采用返回的文档(兼容起见,直接提交扁平状态文档仍然接受)。每次读取(`GET`)同样会先归一化文档。
153
+ ---
233
154
 
234
- ### 扩展市场(MCP 与技能)
155
+ ## 🛒 扩展市场(MCP 与技能)
235
156
 
236
- 面板的技能页与 MCP 页里都有一个可折叠的市场区块,也可以直接调 `GET /api/wukong/market?kind=mcp|skill&q=<关键词>`。市场是**来源聚合与安装编排**,不是目录的所有者,也不把上游收录当作安全审计:
157
+ 技能页和 MCP 页里各有一个可折叠的市场区块,可以搜索并一键安装:
237
158
 
238
- | 来源 | 用途 |
159
+ | 来源 | 内容 |
239
160
  |---|---|
240
- | 官方 MCP Registry(`registry.modelcontextprotocol.io`) | MCP 服务器发现:npm 包 + stdio 传输,或 streamable-http 远端地址、版本与环境变量声明 |
241
- | DSH MCP Market 快照 | DSH 形状的精选 MCP 目录,可直接转成插件的 MCP 行 |
242
- | ClawHub | 技能搜索(隐藏可疑条目);安装时经公开 file API 取 `SKILL.md`,可固定版本 |
243
- | SkillsMP | 技能元数据 + GitHub star;安装时回到条目的 GitHub 源码下载整个技能目录 |
244
- | 随包精选 | 离线兜底:3 个 MCP 服务器 + 2 个技能模板,不联网也能装 |
161
+ | 官方 MCP Registry | MCP 服务器 |
162
+ | DSH MCP Market | 精选 MCP 服务器 |
163
+ | ClawHub | 技能 |
164
+ | SkillsMP | 技能(从 GitHub 源码下载) |
165
+ | 随包精选 | 离线可装的 MCP 服务器与技能模板 |
245
166
 
246
- - 每个条目都带来源名、来源等级(`bundled` / `official` / `curated` / `community`)、权限说明、热度与所需环境变量;**只有先搜索、再显式指定条目 id 才会安装**。
247
- - 某个源不可达只影响它自己(状态行会提示);全部源失败时回退到 `$DSH_HOME/wukong/market-cache` 里的上次成功结果,再回退到随包精选。
248
- - MCP 安装写入插件自己的 MCP 行:`serverName` 自动避让重名,需要环境变量的服务器**以禁用状态**安装并在响应里返回 `needsEnv`,变量在配置里写成 `${NAME}`。
249
- - 技能安装分两条路径:单文件模板注册为运行时技能(面板立刻可见、每个会话可用、重启保持);带附加文件的仓库技能写进 `$DSH_HOME/skills/<name>`,交给 harness 的文件系统技能提供者。
250
- - 安全边界:条目 schema 校验、技能相对路径禁止绝对路径 / `..` / 反斜杠 / 控制字符、单文件 1MB、单目录 8MB、归档 16MB、每源 10 秒超时、每个技能最多 64 个文件,GitHub 归档解压后再做包含性检查;安装不修改 profile,也不执行下载来的代码。
251
-
252
- 技能目录(技能 tab 的清单)仍通过 remote RPC 读取(`api.skills.list`)。所有 wukong 路由都会拒绝跨站调用:外部来源或 opaque(`Origin: null`)来源、以及 `Sec-Fetch-Site: cross-site` 一律 **HTTP 403**;不带 `Origin` 的请求只在回环(loopback)主机上接受。
167
+ - 每个条目都标明来源、可信等级(随包 / 官方 / 精选 / 社区)、权限说明与所需环境变量。**市场只做聚合,不代表安全审计**,安装前请自行判断。
168
+ - 需要环境变量的 MCP 服务器会以**停用状态**装好,填好变量后再启用。
169
+ - 某个来源连不上只影响它自己;全部失败时使用上次成功的结果,再退回随包精选。
253
170
 
254
171
  ---
255
172
 
@@ -257,44 +174,9 @@ dsh web # 或直接重启 DSH Desktop 客户端
257
174
 
258
175
  | 命令 | 作用 |
259
176
  |---|---|
260
- | `/wukong-skill-dir <dir>` | 把技能目录(`SKILL.md` + references)装进用户技能根 |
261
-
262
- 只剩这一条命令,因为它是面板唯一做不到的事——浏览器读不到任意主机目录。列出、启用 / 停用、卸载、markdown 与 zip 安装、状态查看、导出 / 导入 patch 层都由面板承担,不再各配一条命令:它们要么只是面板的重复,要么在 `/` 菜单里点一下就会因为缺参数直接报错。命令声明的 `input` 让 `/wukong-skill-dir` 被菜单选中时落回输入框等参数,而不是立刻执行。
263
-
264
- 旧命令族 `/armory-*` 的别名已在 0.14.0 一并去掉,现在只有 `/wukong*` 一套名字。
265
-
266
- > Agent 预设(prompt profile)管理已在 0.12.0 移除:`/wukong-profile` 不再存在,面板也从未提供该 tab(`@deepseek-ai/dsh-agent-presets` 包在该世代已不存在)。
267
-
268
- ---
269
-
270
- ## 🖥️ 平台支持
271
-
272
- | 环境 | 面板 | `/wukong` 命令 |
273
- |---|---|---|
274
- | `dsh web`([deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness),0.2.0-rc.2) | ✅ | ✅ |
275
- | DSH Desktop 客户端([anywhere-labs/dsh-desktop](https://github.com/anywhere-labs/dsh-desktop)) | ✅ | ✅ |
276
-
277
- 通过 profile 组合实现(安装器把 `dsh-plugin-wukong` 装成 profile 依赖并选进 `dsh.profile.bundles`)——无需 fork 客户端,也不需要手改 `cordis.patch.yml`。
278
-
279
- 归档与更新也已跨平台:导出/导入会话依次尝试 `zip`/`unzip` → bsdtar(`tar`)→ PowerShell,一键更新在 POSIX 上调用 `npm`、仅在 Windows 上调用 `npm.cmd`。
280
-
281
- ## 🔄 一键更新
177
+ | `/wukong-skill-dir <目录>` | 把技能目录(`SKILL.md` + 附带文件)装进用户技能目录 |
282
178
 
283
- 插件面板每次打开都会查询 `GET /api/wukong/version`,Host 端返回 `{ok, latest, current}`:`current` 是**运行时**从 `lib/` 旁边的插件 `package.json` 读到的版本(面板里的编译期常量只作回退,两者不会再各自漂移),`latest` 是最新发布版——先问安装器包 `dsh-plugin-wukong-cli`,再问 `dsh-plugin-wukong`,两个都取不到(registry 不可达或尚未发布)时返回空串。面板版本徽章显示 `current`,并与 `latest` 比较;发现新版本时顶部显示横幅:
284
-
285
- > 有新版本 vX.Y.Z(当前 v0.21.0) [一键更新]
286
-
287
- 点击「一键更新」→ Host 端通过平台的 `npm`(Windows 为 `npm.cmd`)执行 `npm exec --yes --package=dsh-plugin-wukong-cli -- wukong`:装上并运行**安装器包**原地重装 → 提示「更新完成,请重启客户端生效」。该路由要求请求体显式带上 `{"confirm":true}`,否则返回 HTTP 400 `confirmation-required`。
288
-
289
- ## 🗑️ 卸载
290
-
291
- ```bash
292
- node cli.cjs uninstall --profile web # 或 node cli.cjs uninstall(全部 profile)
293
- ```
294
-
295
- 移除方式与安装对称:`pnpm remove dsh-plugin-wukong`(没装 pnpm 时只提示并取消 bundle 选择,依赖留在 profile 里),从 `dsh.profile.bundles` 去掉 bundle,再做一次和安装时相同的遗留清理;最后删除插件自己的目录 `$DSH_HOME/wukong/`(状态文档 + 壁纸 + 对话导出)。
296
-
297
- `$DSH_HOME/skills/` 下已解压的技能按设计保留;提示词/技能/MCP 等托管配置**随 `$DSH_HOME/wukong/` 一起删除**(0.14.0 起不再保留,卸载即彻底清除)。
179
+ 其余管理操作都在面板里完成。
298
180
 
299
181
  ## 🧰 在聊天中使用技能
300
182
 
@@ -305,226 +187,60 @@ node cli.cjs uninstall --profile web # 或 node cli.cjs uninstall(全部 pro
305
187
  /mission-keeper
306
188
  ```
307
189
 
308
- 技能体被注入,agent 按它执行。`modelInvocable` 的技能模型也可自主调用。
309
-
310
- ## 🏗️ 架构
190
+ 技能内容会注入给助手,按它执行;允许模型调用的技能,模型也会在需要时自己调用。
311
191
 
312
- ```
313
- DSH 运行时(0.2.0-rc.2)
314
- │
315
- ├─ Web 面板:dsh-plugin-wukong 的 client face(dsh.client)
316
- │ GET/POST /api/wukong/state
317
- │ GET /api/wukong/skills
318
- │ POST /api/wukong/mcp/test
319
- │ POST /api/wukong/skills/zip
320
- │ POST /api/wukong-wallpaper/upload
321
- │ GET /api/wukong-wallpaper/image/<id>
322
- │ GET /api/wukong/stats | /sessions | /version
323
- │ POST /api/wukong/export | /import | /delete | /update
324
- │
325
- ├─ remote RPC:api.skills.list
326
- │
327
- └─► Host 行:id=wukong,name=dsh-plugin-wukong(bundle)
328
- • $DSH_HOME/wukong/state.json (原子写入)
329
- • ctx.systemPrompt.section (按作用域注入)
330
- • ctx.skills.register
331
- ```
192
+ ---
332
193
 
333
- - **插件包一个包,两个面**:`dsh-plugin-wukong` 的 `package.json` 里 `dsh.bundle.patch` 指向自己的 `cordis.patch.yml`(唯一的 Host 行 `id: wukong`),同时 `dsh.client`(`platform: web` + `inject`)指向 `exports["./client"]` 的 `client/client.js`。面板由**同一个条目**的 `dsh.client` 字段发现,所以**不需要第二个插件包、也不需要第二条 loader 行**;安装器是另一个包(`dsh-plugin-wukong-cli`,不是 bundle)。
334
- - **Host 侧**持有提示词/技能/命令/MCP/壁纸的 CRUD 与持久化(`$DSH_HOME/wukong/state.json`),通过 `ctx.systemPrompt.section` 按作用域注入提示词(关闭插值)、`ctx.skills.register` 注册技能;并注册 `/api/wukong/*` 与 `/api/wukong-wallpaper/*` 路由(状态读写、技能目录、MCP 测试、zip 技能、对话导入导出、会话删除、使用统计、版本检查、一键更新)。
335
- - **生图工具**由 Host 在 `ctx.inject(['tools'])` 的独立 fiber 里注册 `generate_image`(`ctx.tools.register`)——只有选好 Provider 与模型才注册,保存 / 清除设置时立即注册或卸载;设置、Provider 路由与附件服务都按次读取;对话展示视图由面板侧在 `tool.call.toolview` 按工具名注册。
336
- - **面板侧**通过插件自有的同源路由读写状态文档,技能目录走插件自己的 `GET /api/wukong/skills`——**不碰 settings 命名空间**,也不直接调 DSH 内部,更不依赖 `api-remotes` / `sessions` 这类远程 API。面板的装载声明只列真实存在的包:`dsh.client.inject` 为 `@deepseek-ai/dsh-client-locale`、`@deepseek-ai/dsh-client-ui-settings`;其 cordis service inject 为 `['slots','locale']`。
337
- - **可选 peer**:`@deepseek-ai/*` 运行时包与 `react` 全部在 `peerDependenciesMeta` 里标为 `optional`,运行时 `dependencies` 为空。原因是这些运行时包不在公共 npm 源上,写成必选 peer 会让 `pnpm add` 直接 `ERR_PNPM_FETCH_404` 失败;标成可选后 pnpm 能顺利安装,模块仍由宿主在运行时提供。
338
- - **安装器**(`dsh-plugin-wukong-cli`)只做标准三件事:`pnpm add`、选 bundle、清理旧拷贝式安装——web 与 desktop profile 共用同一套机制。
194
+ ## 🗄️ 数据存放位置
339
195
 
340
- ## 📦 包含的包
196
+ 插件只写自己的文件,**不改动 `settings.yaml`** 等宿主配置:
341
197
 
342
- | 包 | 作用 |
198
+ | 路径 | 内容 |
343
199
  |---|---|
344
- | `dsh-plugin-wukong-cli` | 安装器 CLI(bin `wukong` → `./cli.cjs`,含卸载):profile 发现、bundle 注册、遗留清理。它**不声明 `dsh` 字段,因此不是 bundle**;`files` 里只有 `cli.cjs` 与文档,不带插件副本——它装的就是 spec 指定的那份 |
345
- | `dsh-plugin-wukong` | 唯一的插件包(`packages/wukong/`):Host 服务(状态文档 + 提示词/技能/命令/MCP/壁纸/对话/统计 + 路由)**和** Web 面板(六 tab:提示词/技能/MCP/Wallpaper/对话/统计);声明 `dsh.bundle.patch` 与 `dsh.client`(platform web),必须装进 profile 才生效 |
346
-
347
- 插件包 `dsh-plugin-wukong` 一个包声明两面(`dsh.bundle.patch` + `dsh.client`),形制与社区插件 `dsh-plugin` 相同;安装器 `dsh-plugin-wukong-cli` 只负责把它装进 profile。两个名字分开是有意的:`pnpm add dsh-plugin-wukong`(或在 harness 插件管理器里选 `dsh-plugin-wukong`)本来就是标准路径,安装器命令与 bundle 不该抢同一个名字。
200
+ | `$DSH_HOME/wukong/state.json`(默认 `~/.dsh/wukong/state.json`) | 提示词、技能、MCP 服务器、壁纸设置、生图设置(不含端点与密钥) |
201
+ | `$DSH_HOME/wukong/wallpapers/` | 上传的壁纸图片 / 视频 |
202
+ | `$DSH_HOME/wukong/exports/` | 对话导出的 zip |
203
+ | `$DSH_HOME/skills/` | 以 zip 或目录方式安装的技能 |
348
204
 
349
- ## 🗂️ 仓库结构
350
-
351
- ```
352
- dsh-plugin-wukong/
353
- ├── cli.cjs # 一键安装/卸载 CLI(pnpm add + 选 bundle + 遗留清理)
354
- ├── package.json # 安装器包 `dsh-plugin-wukong-cli`(bin: wukong → ./cli.cjs)
355
- ├── packages/ # 发布真相:唯一的插件包(lib + client + src + manifest)
356
- │ └── wukong/ # 插件包 `dsh-plugin-wukong`
357
- │ ├── package.json # dsh.bundle.patch + dsh.client + 可选 peer
358
- │ ├── cordis.patch.yml # 唯一的 Host 行(id: wukong)
359
- │ ├── lib/ # 构建产物:index.js + invariant.js
360
- │ ├── client/client.js # 构建产物:浏览器面板(module-loader bundle)
361
- │ ├── wallpapers/ # 随包附带的五张原创内置风景(JPG + 缩略图)
362
- │ └── src/ # Host 源码 + src/client/ 面板源码
363
- ├── scripts/build-lib.mjs # esbuild 构建发布产物(devDependencies:esbuild + typescript 与 @types/*)
364
- ├── scripts/verify-shipped.mjs # 产物结构/语法自检(CI 用)
365
- ├── scripts/typecheck.mjs # tsc 类型检查(未 link:dev 时报告跳过并以 0 退出)
366
- ├── scripts/build-shipped.mjs # 可选:从 DSH monorepo checkout 同步源码/产物(不覆盖清单、patch、面板 bundle)
367
- ├── scripts/link-dev.mjs # 把本机已装的 harness 包软链进 node_modules/@deepseek-ai/(供差分测试与类型检查)
368
- ├── test/ # node --test 用例(状态/同源/归档/patch/不变量/对话统计/提示词 section/壁纸 Range 与内置风景)
369
- ├── docs/preview/ # 面板真实截图
370
- ├── demo/demo.html # UI 预览(mock 数据)
371
- ├── README.md # 本文(中文)· README.en.md 英文版
372
- ├── UPSTREAM.md # 官方合入指南
373
- ├── CHANGELOG.md # 版本历史
374
- ├── PUBLISHING.md # 发布指南
375
- ├── TESTING.md # 测试指南
376
- ├── LICENSE # MIT
377
- └── .github/workflows/ci.yml # CI 质量门禁
378
- ```
379
-
380
- > ⚠️ 0.13.0 之前的两个包(`@deepseek-ai/dsh-switchblade` + `@deepseek-ai/dsh-client-ui-switchblade`)与它们的源码镜像 `plugin-src/` 都已不存在;0.14.0 起包目录也从 `packages/switchblade/` 改名为 `packages/wukong/`。发布真相只有 `packages/wukong`(`lib/` + `client/` + `src/`)。旧目录需要时可从 git 历史取回。
381
-
382
- ## 🛠️ 开发
383
-
384
- 改源码后重建发布包(**不需要 deepseek-harness checkout**):
385
-
386
- ```bash
387
- npm install # devDependencies:esbuild(打包)、typescript + @types/node / @types/react(类型检查)
388
- npm run link:dev # 把本机已安装 harness 的 @deepseek-ai/* 软链进 node_modules/(类型检查与差分用例需要)
389
- node scripts/build-lib.mjs # 或 npm run build:重建发布产物
390
- ```
391
-
392
- 构建产物(前两项在插件包 `dsh-plugin-wukong` 里,第三项在安装器包里):
393
-
394
- - `packages/wukong/lib/index.js` + `lib/invariant.js`(ESM,`@deepseek-ai/*` 与 `node:*` 全部 external,由 profile 自身解析)
395
- - `packages/wukong/client/client.js`——浏览器面板打成 harness module-loader bundle:`window.__ModuleLoader__.load({ id, factory })`,`react` / `react/jsx-runtime` 也留 external 交给 loader 的模块表
396
- - `dist/cli.cjs`——安装器的发布版,由仓库根目录可读的 `cli.cjs` 构建(包的 `bin` 与 `postinstall` 指向它)
397
-
398
- 所有发布产物都经过压缩与混淆,**不是可读代码**;可读的源码只在仓库里(`packages/wukong/src/` 与根目录 `cli.cjs`),发布的包不带它们。构建是确定性的(固定了混淆的随机种子),所以 `npm run verify` 能检查提交的产物与源码一致。
399
-
400
- 发布前自检:
401
-
402
- ```bash
403
- npm run verify # = node scripts/verify-shipped.mjs && node scripts/typecheck.mjs && node --test
404
- npm test # 只跑 node --test
405
- npm run typecheck # 只跑类型检查(tsc -p packages/wukong/tsconfig.json --noEmit)
406
- ```
407
-
408
- `node scripts/verify-shipped.mjs` 检查包身份(安装器 vs 插件包)、结构、语法与构建可复现性,`npm run typecheck` 用固定的 `typescript` devDependency 做类型检查;`npm test` 用 Node 自带的 `node --test` 跑 `test/`,覆盖状态归一化、同源守卫、归档封堵(zip slip / 符号链接)、bundle patch 往返、校验不变量、项目 key 编码(与已安装的持久化后端逐项对照)、首字时间(与 harness 对照)、提示词 section 作用域与「不插值」保证(与 harness 渲染器逐项对照)。
409
-
410
- 与 harness 对照的差分用例、以及类型检查,都要先把本机已安装的 harness 包链进仓库:`npm run link:dev`(`scripts/link-dev.mjs`)会在 gitignore 的 `node_modules/@deepseek-ai/` 下建软链;没链时这些用例会自行跳过,其余用例照常通过。也可以显式指定路径:`node scripts/link-dev.mjs /path/to/@deepseek-ai/dsh`。
411
-
412
- 测试需要 **Node 24 或更高版本**(直接用 Node 的类型擦除跑 TypeScript 源码)。`packages/wukong/tsconfig.json` 是自包含配置(没有失效的 `extends`,也没有过期的 project references),`npm run typecheck` 用它做类型检查(`tsc -p packages/wukong/tsconfig.json --noEmit`,`typescript` 是固定的 devDependency)。没跑过 `npm run link:dev` 的 checkout 上,`@deepseek-ai/*` 的 import 解析不到,脚本会报告跳过并以 0 退出(和需要 DSH 运行时的那部分用例一样);跑过 `npm run link:dev` 后才是严格检查,任何诊断都算失败。
413
-
414
- `scripts/build-shipped.mjs <harness-checkout>`(`npm run build:shipped`)是**可选**的上游同步步骤:它只把 `<harness>/packages/wukong/wukong/src` → `packages/wukong/src`、`<harness>/packages/client/ui-wukong/src/client` → `packages/wukong/src/client`、以及 `lib/{index,invariant}.js` 拷回来,**不会覆盖**仓库自己的 `package.json`、`cordis.patch.yml` 和 `client/client.js`;同步完仍需跑 `node scripts/build-lib.mjs` 重新构建。日常改这个仓库不需要它。
415
-
416
- 版本更新四处同步:
417
-
418
- 1. 根 `package.json` `version`(安装器 `dsh-plugin-wukong-cli`)
419
- 2. `packages/wukong/package.json` `version`(插件包 `dsh-plugin-wukong`)
420
- 3. `WUKONG_VERSION`(`packages/wukong/src/client/WukongSection.tsx`)
421
- 4. `CHANGELOG.md`
422
-
423
- 然后重建面板 bundle,让版本徽章跟着更新。
424
- ### 连接本地开发版 / 切回已发布版
425
-
426
- 日常开发时,让 DSH 的某个 profile 直接用仓库里的工作副本,改完重建就能看到效果;想用回正式版时再切回去。两者都用同一个安装器,区别只在 `--spec`。
427
-
428
- **切到本地开发版**(在仓库根目录,`--profile` 选要连的那个,多个用逗号分隔):
429
-
430
- ```bash
431
- node cli.cjs --profile web --spec link:$PWD/packages/wukong
432
- ```
433
-
434
- 它把 profile 里的 `node_modules/dsh-plugin-wukong` 换成指向 `packages/wukong` 的软链,依赖记录变成 `link:…`。然后重启 `dsh web`(桌面端则重启 DSH.app)。
435
-
436
- **改完源码让它生效**:软链指向的是构建后的产物(`lib/`、`client/`),不是 `src/`,所以每次改动后要重建,再重启或刷新页面:
437
-
438
- ```bash
439
- npm run build
440
- ```
441
-
442
- **调试时用开发版构建**:`npm run build` 的产物经过压缩与混淆,报错堆栈里没有函数名。调试时改跑:
443
-
444
- ```bash
445
- npm run build:dev
446
- ```
447
-
448
- 它把**同样的文件写到同样的位置**(所以软链着的 profile 重启就能用),只是不压缩、不混淆,代码读起来和源码一致,堆栈里有真实的函数名。每个开发版产物的第一行都是 `DEV BUILD` 注释。**别把它提交或发布**:`npm run verify`、`node scripts/build-lib.mjs --check` 和两个包的 `prepublishOnly` 钩子(`npm publish` 前自动运行)看到这个标记都会失败并提示先跑 `npm run build`。调试完记得 `npm run build` 切回正式构建。
449
-
450
- **确认当前连的是哪一份**:
205
+ ---
451
206
 
452
- ```bash
453
- ls -l ~/.dsh/profiles/web/node_modules/dsh-plugin-wukong # 带 `->` 的是软链 = 本地开发版;普通目录 = 已发布版
454
- ```
207
+ ## 🔄 一键更新
455
208
 
456
- 也可以看 `~/.dsh/profiles/web/package.json`:依赖是 `link:…` 就是开发版,是 `^x.y.z` / `x.y.z` 就是 npm 版。两者版本号可能一样,面板里的版本徽章区分不出来。
209
+ 面板打开时会检查新版本;有新版本时顶部显示提示条,点「一键更新」即可原地重装,完成后**重启客户端**生效。
457
210
 
458
- **切回已发布版**(不带 `--spec`,装的是 npm 上与安装器同版本的包):
211
+ ## 🗑️ 卸载
459
212
 
460
213
  ```bash
461
- npx dsh-plugin-wukong-cli --profile web
214
+ npx dsh-plugin-wukong-cli uninstall --profile web # 只从 web 卸载
215
+ npx dsh-plugin-wukong-cli uninstall # 从全部 profile 卸载
462
216
  ```
463
217
 
464
- 注意:
465
-
466
- - 一个 profile 同一时间只有一个来源,软链与 npm 版互相替换,不会共存。
467
- - 两种方式读写的是**同一份数据**(`$DSH_HOME/wukong/`:提示词、技能、MCP、壁纸),开发中改坏数据格式会影响你日常在用的那份。想放心折腾,就用隔离的 `DSH_HOME`(见 [`TESTING.md`](./TESTING.md) 的第 2 步):
468
-
469
- ```bash
470
- DSH_HOME=/tmp/wukong-dev node cli.cjs --profile web --spec link:$PWD/packages/wukong
471
- DSH_HOME=/tmp/wukong-dev dsh --profile web --no-open --port 3917 # 换一个没被占用的端口
472
- ```
473
-
474
- - 正式构建是混淆过的,浏览器控制台和宿主日志里的报错堆栈**读不出原函数名**。调试时改用**开发版构建**,见下一节。
475
- - `npm install` 会清掉 `npm run link:dev` 建的 `node_modules/@deepseek-ai/` 软链,之后要再跑一次 `npm run link:dev`,类型检查才会恢复严格。
218
+ 卸载会从 profile 移除插件,并删除插件自己的数据目录 `$DSH_HOME/wukong/`(提示词、技能、MCP、壁纸等设置以及对话导出都会一起删除)。`$DSH_HOME/skills/` 下已解压的技能会保留。
476
219
 
220
+ ---
477
221
 
478
222
  ## ❓ FAQ
479
223
 
480
- **Q: 为什么我的客户端侧边栏图标是齿轮而不是书?**
481
- A: 桌面客户端打包版的 `SettingsRoot` 硬编码了图标映射。通过 npm 安装器的 profile 组合,面板能正常工作,但书图标需要官方合入(见 [`UPSTREAM.md`](./UPSTREAM.md))。
482
-
483
- **Q: 支持旧版 DSH(2.0.9 世代)吗?**
484
- A: 不支持,而且是有意的。0.12.0 按 0.2.0-rc.2 的内部接口(`SettingsForms`、官方 remote 命名空间)重写,0.13.x / 0.14.x 沿用它;旧的 `settingsNamespace` / `settingsScope` 在该世代已不存在,两代只能二选一。用 0.11.x 请配旧世代运行时。
224
+ **Q: 为什么设置侧栏里 Wukong 的图标是齿轮而不是书?**
225
+ A: 桌面客户端打包版的设置侧栏图标是写死的映射,插件改不了;面板功能不受影响。
485
226
 
486
227
  **Q: 会话导入后另一台机器看不到?**
487
- A: 导入成功后需要**重启 DSH 客户端**让其重新扫描会话列表;若目标项目路径不同,在导入前填写「目标项目 key」(形如 `--C-Users-xxx--`)以归入正确项目。
228
+ A: 导入成功后需要**重启 DSH 客户端**让它重新扫描会话列表;如果目标项目路径不同,导入前填写「目标项目 key」(形如 `--C-Users-xxx--`)以归入正确项目。
488
229
 
489
230
  **Q: 统计里的成本准确吗?**
490
- A: 成本是**估算**(内置单价 × token:输入 $0.3/M、输出 $1.2/M、缓存读 $0.03/M、缓存写 $0.6/M),不是真实账单。
231
+ A: 是**估算**(内置单价 × token:输入 $0.3/M、输出 $1.2/M、缓存读 $0.03/M、缓存写 $0.6/M),不是真实账单。
491
232
 
492
- **Q: 会不会影响我已有的配置/会话?**
493
- A: 不会。插件只写自己的 `$DSH_HOME/wukong/{state.json,wallpapers,exports}/` 与 `$DSH_HOME/skills/`,**不再写入 `settings.yaml`**,其他配置一律不动。安装器仍会体检 `settings.yaml` 体积,防止它撑过客户端 4MB 上限。
233
+ **Q: 会不会影响我已有的配置和会话?**
234
+ A: 不会。插件只写 `$DSH_HOME/wukong/` 和 `$DSH_HOME/skills/`,不写 `settings.yaml`。
494
235
 
495
- **Q: 状态文档写坏了怎么办?**
496
- A: 写入是原子的(临时文件 + rename),崩溃不会留下半截文档。真出问题直接删 `$DSH_HOME/wukong/state.json`,插件下次启动会重建空状态。
236
+ **Q: 设置文件写坏了怎么办?**
237
+ A: 写入是原子的,中途崩溃不会留下半截文件。真出问题可以删掉 `$DSH_HOME/wukong/state.json`,插件下次启动会重建空设置。
497
238
 
498
239
  **Q: 支持离线安装吗?**
499
- A: 可以:`node cli.cjs --spec <本地路径或 tarball>` 用本地来源走标准 pnpm 安装。本地路径、tarball、git 地址都是普通 pnpm spec,装法与 npm 包名完全一样。
240
+ A: 可以,用 `--spec` 指定本地路径或 tarball:`npx dsh-plugin-wukong-cli --spec <本地路径或 tarball>`。
500
241
 
501
242
  **Q: 为什么安装一定要 pnpm?**
502
- A: 因为 harness 的插件管理器就是这么管理的:插件的「已安装」身份来自 profile 里的一条 pnpm 依赖记录。安装器在 profile 目录里跑 `pnpm add`,装完侧栏**插件**页和**设置 → 插件**的「已安装」里就能看到并可开关;找不到 pnpm 时安装器直接报错退出,因为 profile 安装本质就是一条 pnpm 依赖。
503
-
504
- **Q: 为什么 `pnpm add` 不会去下载一堆 `@deepseek-ai/*`?**
505
- A: 这些运行时包不在公共 npm 源上,所以插件把它们(以及 `react`/`react-dom`)全部声明为**可选 peer**(`peerDependenciesMeta.optional`),并让运行时 `dependencies` 保持为空。pnpm 因此能顺利装上插件,而这些模块实际由 harness 宿主在运行时提供。
506
-
507
- **Q: 技能从哪里来?**
508
- A: 四种:手动填写、`.md` 文件选择、面板导入 `.zip`、会话内 `/wukong-skill-dir`(目录)。目录式与 zip 式都落到 `$DSH_HOME/skills/`,安装后统一进「技能」tab 管理。
509
-
510
- ## 📚 文档
511
-
512
- | 文档 | 说明 |
513
- |---|---|
514
- | [`README.en.md`](./README.en.md) | 英文版自述 |
515
- | [`TESTING.md`](./TESTING.md) | 本地功能测试(含隔离 `DSH_HOME` 的端到端流程) |
516
- | [`PUBLISHING.md`](./PUBLISHING.md) | 发布新版本指南 |
517
- | [`UPSTREAM.md`](./UPSTREAM.md) | 官方合入指南(书图标 PR) |
518
- | [`CHANGELOG.md`](./CHANGELOG.md) | 完整版本历史 |
519
-
520
- ## 🤝 贡献 / 官方合入
521
-
522
- 见 [`UPSTREAM.md`](./UPSTREAM.md) —— 如何让面板原生内置进 `deepseek-ai/deepseek-harness` 与 `anywhere-labs/dsh-desktop`(客户端侧边栏书图标)。
523
-
524
- ## 📄 许可
525
-
526
- MIT
527
-
528
- ## 🔗 友情链接 · Friends
243
+ A: harness 的插件管理器就是按 profile 里的 pnpm 依赖来识别「已安装」插件的,所以安装器必须用 pnpm 把插件装进 profile。
529
244
 
530
- - [**LINUX DO**](https://linux.do/) — 技术社区 · LINUX DO community
245
+ **Q: 开了壁纸后某些文字还是看不清?**
246
+ A: 在 Wukong 面板的壁纸页调高「遮罩」或打开「自动遮罩」;浮层太透可以调高「浮层透明度」。